﻿using System;
using System.Collections.Generic;
using DoNet.SFExpress.Framework.SCS_PUSH;

namespace DoNet.SFExpress.Framework.EXP_RECE
{
    /// <summary>
    /// 速运API
    /// </summary>
    public class ExpReceApi
    {
        #region 通用寄件类

        /// <summary>
        /// 下订单接口 
        /// 向顺丰系统下订单，实现订单与运单的绑定关系
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CreateOrder(string partnerID, string checkword, MsgDataRequestCreateOrder data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_CREATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCreateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单确认/取消接口 
        /// 如果订单下CALL，可以通过此接口确认或取消
        /// 接口用于以下场景:
        /// (1)客户在确定将货物交付给顺丰托运后，将运单上的一些重要信息，如快件重量通过此接口发送给顺丰。
        /// (2)客户在发货前取消订单。
        /// 注意：订单取消之后，订单号也是不能重复利用的。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult UpdateOrder(string partnerID, string checkword, MsgDataRequestUpdateOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*
            1. 功能描述
            接口用于以下场景:

            (1)客户在确定将货物交付给顺丰托运后，将运单上的一些重要信息，如快件重量通过此接口发送给顺丰。
            (2)客户在发货前取消订单。

            注意：订单取消之后，订单号也是不能重复利用的。

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_UPDATE_ORDER
            生产环境地址	https://bspgw.sf-express.com/std/service
            香港生产环境	https://sfapi-hk.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（EXP_RECE_UPDATE_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            #	属性名	类型(约束)	必填	默认值	描述
            1	orderId	String(64)	是		客户订单号
            2	dealType	Number(1)	否	1	客户订单操作标识: 1:确认 (丰桥下订单接口默认自动确认，不需客户重复确认，该操作用在其它非自动确认的场景) 2:取消
            3	waybillNoInfoList	List	否		顺丰运单号(如dealtype=1， 必填)
            4	customsBatchs	String(20)	否		报关批次
            5	collectEmpCode	String(30)	否		揽收员工号
            6	inProcessWaybillNo	String(100)	否		头程运单号
            7	sourceZoneCode	String(10)	否		原寄地网点代码
            8	destZoneCode	String(10)	否		目的地网点代码
            9	totalWeight	Number(17,5)	否		订单货物总重量，包含子母 件，单位千克，精确到小数点 后3位，如果提供此值，必 须>0
            10	totalVolume	Number(16,5)	否		订单货物总体积，单位立方厘 米，精确到小数点后3位，会 用于计抛（是否计抛具体商务 沟通中双方约定）
            11	expressTypeId	Number(5)	否		快件产品类别，支持附录《快 件产品类别表》的产品编码 值，仅可使用与顺丰销售约定 的快件产品
            12	extraInfoList	List	否		扩展属性
            13	totalLength	Number(16, 5)	否		客户订单货物总长，单位厘米， 精确到小数点后3位，包含子 母件
            14	totalWidth	Number(16, 5)	否		客户订单货物总宽，单位厘米， 精确到小数点后3位，包含子 母件
            15	totalHeight	Number(16, 5)	否		客户订单货物总高，单位厘米， 精确到小数点后3位，包含子 母件
            16	serviceList	List	否		增值服务信息
            17	isConfirmNew	Number (1)	否		是否走新通用确认1：支持修改联系人 2：支持改其他客户订单默认0
            18	destContactInfo	OrderContactInfoDto	否		收件人信息
            19	isDocall	Number(1)	否		是否通过手持终端通知顺丰收派员上门收件， 支持以下值：1：要求其它为不要求
            20	specialDeliveryTypeCode	String(3)	否		1. 特殊派送类型代码 身份验证 2. 极效前置单
            21	specialDeliveryValue	String(100)	否		1> 特殊派件具体表述 证件类型:证件后8位 如：1:09296231（1表示身份证，暂不支持其他证件） 2>.极效前置单时:Y:若不支持则返回普通运单N:若不支持则返回错误码
            22	sendStartTm	Date	否		预约时间(上门揽收时间)
            23	pickupAppointEndtime	Date	否		上门揽收截止时间
            2.3.1 元素<请求> OrderUpdate/waybillNoInfoList
            #	属性名	类型(约束)	必填	默认值	描述
            1	waybillType	Number(1)	否		运单号类型 1：母单 2 :子单 3 : 签回单
            2	waybillNo	String(15)	否		运单号
            3	boxNo	String(64)	否		箱号
            4	length	Number (16,3)	否		长
            5	width	Number (16,3)	否		宽
            6	height	Number (16,2)	否		高
            7	volume	Number (16,2)	否		体积（立方厘米）
            8	weight	Number (16,2)	否		重量(kg)
            2.3.2 元素<请求> OrderUpdate/extraInfoList
            #	属性名	类型(约束)	必填	默认值	描述
            1	attrName	String(256)	否		扩展字段 说明： attrName为字段定义， 具体如下表，value存在 attrVal
            2	attrVal	String(1024)	否		扩展字段值
            扩展字段备注
            attrName	attrVal
            attr001	
            attr002	
            userId	商家或合作店铺id 丰网业务
            branchCode	丰网合作网点（丰网必填) 丰网业务
            branchAddressId	丰网合作地址id 丰网业务
            channelCode	渠道编码 丰网业务
            2.3.3. 元素<请求> OrderUpdate/serviceList
            #	属性名	类型(约束)	必填	默认值	描述
            1	name	String(20)	是		增值服务名，如COD等
            2	value	String(30)	条件		增值服务扩展属性，参考增值 服务传值说明
            3	value1	String(30)	条件		增值服务扩展属性1
            4	value2	String(30)	条件		增值服务扩展属性2
            5	value3	String(30)	条件		增值服务扩展属性3
            6	value4	String(30)	条件		增值服务扩展属性4
            2.3.4 元素<请求> OrderUpdate/List

            #	属性名	类型（约束）	必填	默认值	描述
            1	name	String(20)	是		增值服务名，如COD等。
            2	value	String(30)	条件		增值服务扩展属性，参考增值服务传值说明。
            3	value1	String(30)	条件		增值服务扩展属性
            4	value2	String(30)	条件		增值服务扩展属性2
            5	value3	String(30)	条件		增值服务扩展属性3
            6	Value4	String(30)	条件		增值服务扩展属性4
            2.3.5 元素<请求> OrderUpdate/OrderContactInfoDto

            #	属性名	类型（约束）	必填	默认值	描述
            1	company	String(100)	条件		公司名称
            2	contact	String(100)	条件		联系人
            3	tel	String(20)	条件		联系电话
            4	mobile	String(20)	否		方手机
            5	country	String(30)	是		国家或地区 2位代码参照附录国家代码附件
            6	province	String(30)	否		所在省级行政区名称如：北京、广东省、广西壮族自治区等
            7	city	String(100)	否		所在地级行政区名称，必须是标准的城市称谓 如：北京市、深圳市、大理白族自治州等
            8	county	String(30)	否		所在县/区级行政区名称，必须是标准的县/区称谓，如：福田区
            9	address	String(200)	条件		详细地址，若province/city字段的值不传，此字段必须包含省市
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，S0000成功
            3	errorMsg	String	是		错误描述
            4	msgData	String	是		返回的详细数据
            2.5. 响应参数<msgData>
            #	属性名	类型(约束)	必填	默认值	描述
            1	orderId	String(64)	是		客户订单号
            2	waybillNoInfoList	List	否		顺丰运单号
            3	resStatus	Number(1)	是		备注 1:客户订单号与顺丰运单不匹配 2 :操作成功
            4	extraInfoList	List	否		扩展属性
            2.6. 请求示例\应用场景(JSON)示例
            请求报文（订单确认）:

            {
                "dealType": 1,
                "orderId": "BZL51054473992769999",
                "totalHeight": 29.98,
                "totalLength": 29.98,
                "totalVolume": 26946.035992000005,
                "totalWeight": 2.09,
                "totalWidth": 29.98,
                "waybillNoInfoList": [
                    {
                        "waybillNo": "SF2000090670189",
                        "waybillType": 1
                    }
                ]
            }
            请求报文（订单取消）:

            {
                "dealType": 2,
                "language": "zh-CN",
                "orderId": "eb21c793-a45a-4d1e-9a2e-1b6e0cd49668",
                "totalWeight": 1,
                "waybillNoInfoList": []
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应(订单确认成功):
            {
                "apiResponseID": "000173271983983FEDCAD1803FA64A3F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":true,\"errorCode\":\"S0000\",\"errorMsg\":null,\"msgData\":{\"orderId\":\"5ed9696e-a81d-4a5b-968d-182c2d8c09e0\",\"waybillNoInfoList\":[{\"waybillType\":1,\"waybillNo\":\"SF7444400048449\"}],\"resStatus\":2,\"extraInfoList\":null}}"
            }
            失败响应(订单确认失败)：
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":false,\"errorCode\":\"8024\",\"errorMsg\":\"未下单\",\"msgData\":null}"
            }
            响应报文:

            成功响应(订单取消成功):
            {
                "success": true,
                "errorCode": "S0000",
                "errorMsg": null,
                "msgData": {
                    "orderId": "eb21c793-a45a-4d1e-9a2e-1b6e0cd49668",
                    "waybillNoInfoList": [{
                        "waybillType": 1,
                        "waybillNo": "SF7444400043064"
                    }],
                    "resStatus": 2,
                    "extraInfoList": null
                }
            }
            失败响应(订单取消失败)：
            {
            "success":false,
            "errorCode":"8024",
            "errorMsg":"未下单",
            "msgData":null
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明	【处理建议】
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果	
            A1001	必传参数不可为空	serviceCode partnerID requestID timestamp msgDigest msgData 不可为空
            A1002	请求时效已过期	时效参考auth2 https://open.sf-express.com/customerService/395002?interId=590549&faqId=4
            A1003	IP无效	参考常见问题 https://open.sf-express.com/customerService/395002?activeIndex=905584&interId=590549&faqId=2
            A1004	无对应服务权限	联系销售经理，配置权限
            A1005	流量受控	测试环境流量限制为5000，请不要在测试环境做压测
            A1006	数字签名无效	参考常见问题 签名加解密问题 https://open.sf-express.com/customerService/395002?activeIndex=905584&interId=795986
            A1007	重复请求	过一分钟在尝试
            A1008	数据解密失败	
            A1009	目标服务异常或不可达	
            A1099	系统异常	
            3.2 业务异常代码
            #	errorCode	描述	【处理建议】
            1	20052	月结卡号不匹配 不允许操作该订单	月结卡号跟传入的不匹配，修改月结卡号匹配后，才能确认
            2	8019	订单已确认或已消单	确认下单模板是否配置为下单自动确认
            3	8018	未获取到订单信息	修改订单号orderId
            4	6136	未传入订单确认信息	传入报文格式有问题
            5	8037	已消单	订单已经取消，再次取消会报错
            6	8017	订单号与运单号不匹配	检查传入的订单号orderId跟运单号是否匹配
            7	8228	传入增值服务不能通过确认接口修改	对应增值服务不支持确认接口修改
            8	8253	订单已取消	订单已经取消，再次取消会报错
            9	8252	订单已确认	订单已经确认，再次确认会报错
            10	20034	预约时间必须大于当前时间	sendStartTm要大于当前时间
            11	8267	新预约时间必须在70分钟后	确认接口传入的预约时间sendStartTm必须大于 （当前时间+70分钟） 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_UPDATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseUpdateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单结果查询接口
        /// 未收到返回数据时，查询订单当前处理情况
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SerachOrderResp(string partnerID, string checkword, MsgDataRequestSerachOrderResp data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_SEARCH_ORDER_RESP";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseSerachOrderResp>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由查询接口 
        /// 通过查询返回当前时间的全部路由节点信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SerachRoutes(string partnerID, string checkword, MsgDataRequestSerachRoutes data, string accessToken = "", string environment = "bspgw")
        {
            /*
            注意事项:
            同一批次顺丰运单路由信息必须为同一语言。
            目前支持中文简体,中文繁体和英文。
            可在服务与支持—>业务文档查看。
            定制路由查询须与顺丰商务人员沟通，客户可基于顺丰所有路由节点（列表可从顺丰商务人员处获取）定制所需的路由节点及其具体描述与操作码。
             */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_SEARCH_ROUTES";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseSerachRoutes>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 子单号申请接口
        /// 下单后，可从此接口获取更多的子单号
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult GetSubMailno(string partnerID, string checkword, MsgDataRequestGetSubMailno data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_GET_SUB_MAILNO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseGetSubMailno>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 预下单接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult PreOrder(string partnerID, string checkword, MsgDataRequestPreOrder data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_PRE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponsePreOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 派送通知接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串 如：{ "waybillNo":"SF7444400067318", "dataType":"71", "language":"zh-cn" } </param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult DeliveryNotice(string partnerID, string checkword, MsgDataRequestDeliveryNotice data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_DELIVERY_NOTICE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseDeliveryNotice>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 清单运费查询接口 
        /// 根据订单号或者运单号查询清单运费
        /// 此功能主要是根据订单号或者运单号查询清单运费信息。
        /// 默认校验月结信息，只能查询顾客编码下绑定成功的月结卡的订单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QuerySFWaybill(string partnerID, string checkword, MsgDataRequestQuerySFWaybill data, string accessToken = "", string environment = "bspgw")
        {
            /*
            1. 功能描述
            此功能主要是根据订单号或者运单号查询清单运费信息。
            默认校验月结信息，只能查询顾客编码下绑定成功的月结卡的订单
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_QUERY_SFWAYBILL
            生产环境地址	https://bspgw.sf-express.com/std/service
            香港生产环境	https://sfapi-hk.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON/XML
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（EXP_RECE_QUERY_SFWAYBILL）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData> /QuerySFWaybill
            #	字段	类型	必填	描述
            1	trackingType	String	是	1:表示按订单查询 2:表示按运单查询
            2	trackingNum	String	是	订单号或运单号；
            3	phone	String	条件	配置校验手机号时必传，支持最高6个收寄方电话后4位下发， 每个电话号码使用英文逗号分隔
            4	bizTemplateCode	String	否	业务配置代码，针对客户业务需求配置的一套接口处理逻辑，一个接入编码可对应多个业务配置代码
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，S0000成功
            3	errorMsg	String	是		错误描述
            4	msgData	String	是		返回的详细数据
            2.5. 响应参数<msgData>
            #	属性名	类型(约束)	默认值	描述
            1	waybillInfo	object		运单信息
            2	waybillFeeList	list		费用信息
            2.3.1.1 元素<响应> waybillInfo

            #	属性名	类型（约束）	描述
            1	waybillNo	String(30)	运单号
            2	orderId	String(64)	客户订单号
            3	waybillChilds	String	子单号,英文逗号分隔
            4	customerAcctCode	String(64)	月结帐号
            5	meterageWeightQty	Double	计费重量
            6	realWeightQty	Double	实际重量
            7	consigneeEmpCode	String(30)	收件员工号
            8	deliverEmpCode	String(30)	派件员工号
            9	cargoTypeCode	String(30)	快件内容
            10	cargoTypeName	String(30)	快件内容名称
            11	limitTypeCode	String(30)	时效类型
            12	limitName	String(30)	时效类型名称
            13	expressTypeCode	String(30)	业务类型
            14	expressTypeName	String(30)	业务类型名称
            15	consValue	Double	声明价值
            16	consValueCurrencyCode	String(30)	声明价值币种
            17	productCode	String(30)	产品代码
            18	productName	String(30)	产品名称
            19	jProvince	String(30)	寄件省份
            20	jCity	String(30)	寄件城市
            21	consignorAddr	String(30)	寄件详细地址
            22	consignorContName	String(30)	寄件联系人
            23	consignorPhone	String(30)	寄件电话号码
            24	consignorMobile	String(30)	寄件手机号
            25	dProvince	String(30)	收件省份
            26	dCity	String(30)	收件城市
            27	addresseeAddr	String(30)	收件详细地址
            28	addresseeContName	String(30)	收件联系人
            29	addresseePhone	String(30)	收件电话号码
            30	addresseeMobile	String(30)	收件手机号
            2.3.1.2 元素<响应> waybillFeeList

            #	属性名	类型（约束	描述
            1	type	String(3)	费用类型
            2	name	String(30)	费用名称
            3	value	Double	费用金额
            4	paymentTypeCode	String(1)	付款类型：1、寄付；2、到付；3、第三方付
            5	settlementTypeCode	String(1)	结算类型：1为现结；2为月结
            6	serviceProdCode	String(30)	增值服务代码
            7	insuredValue	String(30)	保价金额
            8	customerAcctCode	String(30)	月结账号
            备注：费用类型说明
            type字段	name费用释义
            1	运费
            2	其它费用
            3	保价
            4	代收货款服务费
            5	代收货款
            6	正式报关
            7	等通知派送
            8	签单返还
            10	指定派送费用
            12	标准化包装服务
            13	香港偏远件
            14	燃油附加费
            19	委托件
            20	上门收款服务费
            21	特派服务
            23	特安服务
            24	指定日期派送费
            26	定时派送（指定时段)
            27	台湾保价
            28	自寄件费用
            29	自取件费用
            34	台湾偏远附加费
            35	冷冻箱1
            37	特殊增值服务费用
            38	检测服务
            39	木质包装
            40	住宅附加费
            41	定时派送
            42	POS手续费
            43	存仓费
            44	散单代收服务
            45	送货上楼
            46	货物保管
            47	保鲜服务
            48	超长超重服务
            49	节假日派送
            52	验货服务
            53	换货服务
            56	拍照验证
            57	酒宴稽核
            59	口令签收
            62	散单代收服务
            62	散单代收服务
            63	代办航空申报
            65	装卸服务
            66	挂号
            67	个性化包装服务
            71	报关综合服务费
            72	清关综合服务费
            73	提货服务
            74	送货服务
            ES078	特惠提货费
            79	医院服务
            83	精准温控2-8°C
            84	买卖保
            85	维修服务
            86	更改付款方式
            87	保单配送
            88	派件地址变更服务
            90	易碎件
            91	电子验收
            92	高峰资源调节费
            93	原单退回
            94	顺丰国际小包平邮处理费1
            96	国际电商专递操作费
            97	顺丰国际小包退回费
            98	大件入户
            99	税金
            101	票据专送
            102	优惠
            103	安装服务
            104	高峰期附加费
            105	签收确认服务
            106	特殊入仓
            107	优派服务
            108	海外高峰期附加费
            113	丰巢寄件优惠
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
	            "trackingNum": "SF1390005252176",
	            "trackingType": "2",
	            "phone": "8585"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "success": true,
	            "errorCode": "S0000",
	            "errorMsg": null,
	            "msgData": {
		            "waybillInfo": {
			            "orderId": "3eb3e404-d080-407d-b7ec-2390428a0514",
			            "waybillNo": "SF1040460455098",
			            "customerAcctCode": "7551236549",
			            "meterageWeightQty": 1.0,
			            "limitTypeCode": "T6",
			            "expressTypeCode": "B1",
			            "cargoTypeCode": "T6",
			            "shieldFlg": "0",
			            "noticeShieldTemplateCode": null,
			            "jProvince": "广东省",
			            "jCity": "深圳市",
			            "dProvince": "广东省",
			            "dCity": "深圳市",
			            "consValue": 500.0,
			            "consValueCurrencyCode": "CNY",
			            "consigneeEmpCode": "000121",
			            "waybillChilds": "",
			            "consignorAddr": "广东省深圳市福田区DE##EwA9TijCbpzfQrsJwA2lDzNFou4h7SnD0LsNZdx5fkCOkAAD",
			            "realWeightQty": 1.0,
			            "addresseeCompName": null,
			            "addresseeContName": "小小"
		            },
		            "waybillFeeList": [{
			            "type": "1",
			            "name": "运费",
			            "value": 15.0
		            }, {
			            "type": "3",
			            "name": "基础保",
			            "value": 6.0
		            }]
	            }
            }
            失败报文-范例1
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"errorMessage\":\"非法的JSON格式\",\"success\":false,\"errorCode\":\" S0001\"}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明	解决方法
            A1000	统一接入平台校验成功，调用后端服务成功;
            注意：
            不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果	表示接口调用正常
            A1001	必传参数不可为空	请做以下几点检查：
            1、参数列表必传字段未填写
            2、请求报文头，未配置Content-type：application/x-www-form-urlencoded
            3、参数key存在空格问题
            4、http请求参数都通过http URL编码传送
            5、业务数据报文（msgData）为json报文数据格式
            6、接口整体报文为form表单
            A1011	OAuth2认证失败	使用OAuth2认证会产生该提示
            请检查业务接口的accessToken参数是否超过2小时，2小时口令会更新，请调用OAuth2认证接口重新获取
            A1003	IP无效	顾客编码（partnerID）配置了需校验IP，请解除校验或按绑定IP调用接口
            A1004	无对应服务权限	可能存在的原因：
            1、顾客编码（partnerID）没有配置（关联）对应接口的业务接口，请在【开发者对接】-【API列表】中关联；
            2、接口请求数据与实际环境不一致，请先查看【开发者对接】-【API列表】接口状态：
            a、【测试中】请使用沙箱环境
            b、【已上线】请使用正式环境；
            3、后台配置没有生效，可等待2分钟后在试试，如果还是无法操作，请报障人工处理
            A1005	流量受控	丰桥为接口功能联调环境，接口整体都有限流管控，单客户编码对应的每个接口限流规则：
            1、单接口调用30次/s 2、单接口调用3000次/天
            请尽量只操作功能联调，切勿进行接口压测，谢谢！
            A1006	数字签名无效	请做以下几点检查：
            1、确认checkword是否配置正确
            2、确认verifyCode、msgDigest是否加密加签正确
            3、确认参数是否有特殊字符，如：&
            4、参数整体式form表单格式
            5、非java类语言，需注意特殊字符，目前支持的特殊字符“*”，“空格”，“-”请优先使用
            6、如果数字签名操作不便，可改为OAuth2认证，Token交互即可，具体参见【开发规范】【鉴权方式说明】
            A1007	重复请求	接口层暂未启用，业务层主要是针对下单接口，客户请求参数msgData中的orderId请不要重复使用，修改后在调用接口
            A1008	数据解密失败	在特殊场景中使用，如有出现请报障人工处理
            A1009	目标服务异常或不可达	接口下游服务异常，如有出现请报障人工处理
            A1010	状态为沙箱测试	该问题在老客户中会有此类问题，新客户不会出现，如有出现请报障人工处理
            A1099	系统异常	接口服务异常，如有出现请报障人工处理
            3.2 业务异常代码
            原因代码 errorCode	描述 errorMsg	【处理建议】
            8148	没有运单信息!	该订单还未揽收
            8149	无法找到订单数据!	确认传入的订单号或者运单号是否正确 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_QUERY_SFWAYBILL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseQuerySFWaybill>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 通用寄件类

        #region 注册推送类

        /// <summary>
        /// 路由注册接口
        /// 向外提供路由注册功能
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult RegisterRoute(string partnerID, string checkword, MsgDataRequestRegisterRoute data, string accessToken = "", string environment = "bspgw")
        {
            /*
            1. 功能描述
            此功能主要是向外提供路由注册功能。
            备注：对接该接口前，请先对接前置接口：路由推送接口。路由注册成功后，系统会将路由信息通过路由推送接口给客户

            注意： 请先在丰桥设定模式 （设定路径：控制台》开发者对接》查看API》路由注册接口，查看》配置信息》点击 ✎ 选择查询）

            1.1、订单号模式：（type=1）
            type为1订单模式，丰桥页面勾选没有强制效果
            根据订单号+顾客编码（partnerID）,查询订单信息，存在，即可注册成功
            1.2、运单号模式：（type=2）
            type为2运单号模式，丰桥页面勾选没有强制效果
            根据运单号+顾客编码,查询订单信息，存在，即可注册成功
            根据运单号+顾客编码+校验月结卡号,查询订单信息，存在，即可注册成功
            1.3、电话号码模式注册：（type=1或者type=2）
            订单号模式-校验收寄任一方的手机号后四位
            运单号模式-校验收寄任一方的手机号后四位 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_REGISTER_ROUTE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseRegisterRoute>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 图片注册及推送接口
        /// 提供图片注册及推送的功能
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult RegisterWaybillPicture(string partnerID, string checkword, MsgDataRequestRegisterWaybillPicture data, string accessToken = "", string environment = "bspgw")
        {
            /*
            1. 功能描述
            该接口支持客户根据运单号和图片类型进行注册，系统根据注册信息查询是否已经产生对应类型图片，如存在对应图片即生成对应推送任务，根据配置的推送地址推送对应图片信息。如对应图片推送失败，该接口会根据注册信息和推送任务进行重试。由于图片产生的时间不固定，建议在运单妥投后再来注册获取相应图片。
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_REGISTER_WAYBILL_PICTURE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseRegisterWaybillPicture>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由推送接口 RoutePushService
        /// 主动增量推送下单注册后的路由信息
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static ResponseRoutePushService RoutePushService(string body, out RequestRoutePushService reqData)
        {
            /*
            1. 功能描述
            该接口用于当路由信息生产后向客户主动推送要求的顺丰运单路由信息。推送方式为增量推送,对于同一个顺丰运单的同一个路由节点,不重复推送。仅推送通过丰桥接口下单的订单路由信息。
            不管您的下订单是在测试环境，还是在生产环境，当您选择了路由推送接口并填写了接收地址，下单会自动生成测试路由并推送。贵司接口能正常接收并正确响应，则测试成功。
            客户需提供一个符合以下规范的HTTP 或 HTTPS URL,以接收顺丰系统推送的信息。
            请求方法为:“json"或"form”,客户可从配置选项中选择请求方法。
            \1) 请求方法为"json"时,数据类型为"application/json ;charset=UTF-8";
            \2) 请求方法为"form"时,数据类型为"application/x-www-form-urlencoded; charset=UTF-8 “; 请求参数为"content”;数据是以URL编码(字符集为UTF-8)的XML。
            请求方式为:HTTP POST方式推送给客户。
            请求方法为"form"时,客户通过"content"字段接收到数据后,需要先对其进行URL解码,得到相应的XML;请求方法为"json"时,客户可直接从请求的数据流中得到相应的json。
            1.请求方法为form，在客户处理XML信息后,向顺丰系统返回响应XML报文,响应XML报文结果只能为OK/ERR(参见XML报文说明),顺丰系统将重新推送此次交易的所有信息;
            2.请求方法为json，客户处理完Json信息后，向顺丰系统返回响应json报文，响应Json报文结果包含【return_code（0000:成功 1000：失败）、return_msg】
            沙箱环境推送频率:10min/次,沙箱测试环境每单固定推送两条路由数据

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	RoutePushService
            批量交易	最多10个WaybillRoute元素
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.2. 公共请求参数
            名称	值
            接口服务代码	RoutePushService
            批量交易	最多10个WaybillRoute元素
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.2. 公共请求参数
            2.3. 请求参数 /WaybillRoute
            #	属性名	类型（约束）	必填	默认值	描述
            1	mailno	String			客户运单号
            2	acceptAddress	String			收货地址
            3	reasonName	String			异常描述
            4	orderid	String			客户订单号
            5	acceptTime	String			收货时间
            6	remark	String			备注
            7	opCode	String			操作码
            8	id	String			ID
            9	reasonCode	String			异常编码
            10	firstStatusCode	String			一级状态码
            11	firstStatusName	String			一级状态码描述
            10	secondaryStatusCode	String			二级状态码
            10	secondaryStatusName	String			二级状态码描述
            注意事项:
            1)需要与顺丰商务人员沟通确认路由信息的语言，目前支持中文简体，中文繁体和英文。
            2)需要与顺丰商务人员沟通确认推送的方式：
            标准路由推送，可从顺丰商务人员处获取顺丰标准推送路由节点信息列表;
            -定制路由推送，须与顺丰商务人员沟通，客户可基于顺丰所有路由节点（列表可从顺丰商务人员处获取）定制所需的路由节点及其具体描述与操作码。
            查看路由信息操作码。

            2.4. 响应参数 
            #	元素名	类型（约束）	必填	描述
            1	return_code	String	Y	返回响应码
            2	return_msg	String	Y	返回消息
            2.5. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "Body": {
                    "WaybillRoute": [{
                        "mailno": "SF7444400031887",
                        "acceptAddress": "test",
                        "reasonName": "",
                        "orderid": "202003225d33322239ddW1df5t3",
                        "acceptTime": "2020-05-11 16:56:54",
                        "remark": "test",
                        "opCode": "50",
                        "id": "158918741444476",
                        "reasonCode": ""
                    },
                    {
                        "mailno": "SF7444400031887",
                        "acceptAddress": "test",
                        "reasonName": "",
                        "orderid": "202003225d33322239ddW1df5t3",
                        "acceptTime": "2020-05-11 16:56:54",
                        "remark": "test",
                        "opCode": "80",
                        "id": "158918741457126",
                        "reasonCode": ""
                    }]
                }
            }
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "return_code": "0000",
                "return_msg": "成功"
            }
            失败报文-范例1
            {
                "return_code": "1000",
                "return_msg": "系统异常"
            } 
            */
            string return_code = "1000";
            string return_msg = "系统异常";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<RequestRoutePushService>(body);
                if (request != null)
                {
                    reqData = request;
                    return_code = "0000";
                    return_msg = "成功";
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new ResponseRoutePushService()
            {
                return_code = return_code,
                return_msg = return_msg
            };
        }

        /// <summary>
        /// 订单状态推送接口 PushOrderState
        /// 主动增量推动下单后订单状态 
        /// 此接口用于订单状态推送,将订单状态的各类信息推送给对接的客户； 仅限于推送预约上门订单调度状态，非预约订单不推送。
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static SFResponseApiResultData OrderState(string body, out MsgDataRequestOrderState reqData)
        {
            /*
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	PushOrderState
            接口方式	HTTP POST Content_type:application/xml;charset=UTF-8
            接口类型	推送
            报文类型	顺丰支持3种格式推送供客户自行选择
            1、form
            2、xml
            3、json
            2.2. 公共请求参数
            2.3. 请求参数<msgData>
            #	属性名	类型(约束)	必填	描述
            1	orderNo	String(64)	是	客户订单号
            2	waybillNo	String(64)	否	顺丰运单号
            3	orderStateCode	String(20)	是	订单状态
            4	orderStateDesc	String(200)	是	订单状态描述
            5	empCode	String(100)	否	收件员工工号
            6	empPhone	String(100)	否	收件员手机号
            7	netCode	String(20)	否	网点
            8	lastTime	date	否	最晚上门时间
            9	bookTime	date	否	客户预约时间
            10	carrierCode	String(10)	是	承运商代码(SF)
            2.4. 公共响应参数
            2.5. 响应参数<apiResultData>
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String(10)	是		是否成功接收 true:是 false:否
            2	msg	String(200)	否		接收失败异常描述
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
             "requestId": "0597a8d2-42e3-46d6-86e9-14acf03598de",
             "timestamp": "1630376445286",
             "orderState": [{
              "orderNo": "442321000025419019",
              "waybillNo": "SF7444778095881",
              "orderStateCode": "04",
              "orderStateDesc": "调度失败/等待",
              "empCode": "",
              "empPhone": "",
              "netCode": "755A",
              "lastTime": "2021-08-31 09:00:00",
              "bookTime": "2021-08-31 09:00:00",
              "carrierCode": "SF",
              "createTm": "2021-08-31 09:00:00"
             }]
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": "true",
                "code": "0",
                "msg": ""
            }
            失败报文-范例1
            {
                "success": "false",
                "msg": "订单状态接收异常"
            }
            2.7. 请求示例\应用场景(XML)示例
            请求报文:

            <?xml version="1.0" encoding="UTF-8" ?>
            <Request service='PushOrderState' lang='zh-CN'>
                <waybillNo>444123456789</waybillNo>
                <lastTime>2018-04-16 15:23:24</lastTime>
                <empCode >845215</empCode>
                <orderStateCode>04-40001</orderStateCode>
                < netCode >755A</ netCode >
                <bookTime>2018-04-16 15:23:24</bookTime>
                <orderNo>sf20124512</orderNo>
                <empPhone>13888888888</empPhone>
                <orderStateDesc>调度成功,收派员信息</orderStateDesc>
                < carrierCode >SF</ carrierCode >
            </Request>
            响应报文:

            成功响应:
            <?xml version="1.0" encoding="UTF-8" ?>
            <Response>
                <success>true</success>
            </Response>
            失败报文-范例1
            <?xml version="1.0" encoding="UTF-8" ?>
            <Response>
                <success>false</success>
                <msg>订单状态接收异常</msg>
            </Response>
            */
            string apiResultCode = "A1099";
            string apiErrorMsg = "系统异常";
            string apiResponseID = Guid.NewGuid().ToString();
            string apiResultData = "";

            if (!string.IsNullOrEmpty(body))
            {
                MsgDataResponseOrderState result;
                reqData = JsonHelper.DeserializeObject<MsgDataRequestOrderState>(body);
                if (reqData != null)
                {
                    result = new MsgDataResponseOrderState()
                    {
                        success = true,
                        msg = ""
                    };
                }
                else
                {
                    result = new MsgDataResponseOrderState()
                    {
                        success = false,
                        msg = "订单状态接收异常"
                    };
                }
                apiResultCode = "A1000";
                apiErrorMsg = "";
                apiResultData = JsonHelper.SerializeObject(result);
            }
            else
            {
                reqData = null;
            }
            return new SFResponseApiResultData()
            {
                apiResultCode = apiResultCode,
                apiErrorMsg = apiErrorMsg,
                apiResponseID = apiResponseID,
                apiResultData = apiResultData
            };
        }

        /// <summary>
        /// 清单运费推送接口 EXP_RECE_WAYBILLS_FEE_PUSH
        /// 提供清单运费推送功能 
        /// 清单费用收费信息推送给客户，推送相关字段信息：订单号、运单号、子单号、月结账号等，根据配置的属性推送。
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static ResponseWaybillsFeePush WaybillsFee(string body, out RequestWaybillsFeePush reqData)
        {
            /*
            EXP_RECE_WAYBILLS_FEE_PUSH
            
            
            1. 功能描述
            
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_WAYBILLS_FEE_PUSH
            批量交易	不支持
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.2. 公共请求参数
            2.3. 请求参数
            元素名	类型（约束）	必填	描述	
            1	orderNo	String(100)	Y	客户下单时传入的订单号
            2	waybillNo	String(100)	Y	顺丰下单接口返回的15或12位运单号，母单号 如：SF10116351372291
            3	childNos	String(100)	N	多个用逗号隔开,子母件，当一票有多个包裹时，每个子件的运单号
            4	customerAcctCode	String(100)	N	10位数字，用来做账单结算的账号
            5	meterageWeightQty	String(100)	Y	包裹计费重量 单位kg
            6	productName	String(100)	Y	如顺丰特惠，顺丰标快
            7	quantity	String(100)	Y	托寄物包裹数量
            8	volume	String(100)	N	托寄物总体积
            9	feeList	List	N	费用信息
            2.3.1 元素<请求> feeInfo

            #	元素名	类型(约束)	必填	描述
            1	bizOwnerZoneCode	String(100)	Y	业务所属地区编码
            2	currencyCode	String(100)	Y	币别
            3	customerAcctCode	String(100)	Y	付款帐号
            4	feeAmt	String(100)	Y	金额
            5	feeAmtInd	String(100)	Y	个性化费用（如一些折扣或加价费用）
            6	feeIndType	Number(2)	Y	个性费用类型
            7	gatherEmpCode	String(100)	Y	交款人
            8	gatherZoneCode	String(100)	Y	收付款网点
            9	paymentChangeTypeCode	String(100)	Y	付款变更类型
            10	paymentTypeCode	Number(2)	Y	付款类型 1 寄付 2 到付 3 第三方付
            11	serviceId	String(100)	Y	运单服务标记，可忽略
            12	settlementTypeCode	String(100)	Y	结算类型 1 现结 2 月结
            13	versionNo	Number(2)	Y	版本号 当红冲后版本号会增加
            14	waybillId	String(100)	Y	运单关联标记 可忽略
            15	waybillNo	String(50)	Y	运单母单号，
            16	feeTypeCode	String(100)	Y	费用类型 1 主运费 2 其他费用 3 保费 4 代收货款服务费 5 代收货款
            备注：费用类型说明
            feeTypeCode字段	name费用释义
            1	运费
            2	其它费用
            3	保价
            4	代收货款服务费
            5	代收货款
            6	正式报关
            7	等通知派送
            8	签单返还
            10	指定派送费用
            12	标准化包装服务
            13	香港偏远件
            14	燃油附加费
            19	委托件
            20	上门收款服务费
            21	特派服务
            23	特安服务
            24	指定日期派送费
            26	定时派送（指定时段)
            27	台湾保价
            28	自寄件费用
            29	自取件费用
            34	台湾偏远附加费
            35	冷冻箱1
            37	特殊增值服务费用
            38	检测服务
            39	木质包装
            40	住宅附加费
            41	定时派送
            42	POS手续费
            43	存仓费
            44	散单代收服务
            45	送货上楼
            46	货物保管
            47	保鲜服务
            48	超长超重服务
            49	节假日派送
            52	验货服务
            53	换货服务
            56	拍照验证
            57	酒宴稽核
            59	口令签收
            62	散单代收服务
            62	散单代收服务
            63	代办航空申报
            65	装卸服务
            66	挂号
            67	个性化包装服务
            71	报关综合服务费
            72	清关综合服务费
            73	提货服务
            74	送货服务
            ES078	特惠提货费
            79	医院服务
            83	精准温控2-8°C
            84	买卖保
            85	维修服务
            86	更改付款方式
            87	保单配送
            88	派件地址变更服务
            90	易碎件
            91	电子验收
            92	高峰资源调节费
            93	原单退回
            94	顺丰国际小包平邮处理费1
            96	国际电商专递操作费
            97	顺丰国际小包退回费
            98	大件入户
            99	税金
            101	票据专送
            102	优惠
            103	安装服务
            104	高峰期附加费
            105	签收确认服务
            106	特殊入仓
            107	优派服务
            108	海外高峰期附加费
            113	丰巢寄件优惠
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，S0000成功
            3	errorMsg	String	是		错误描述
            4	msgData	String	是		返回的详细数据
            2.5. 响应参数 
            #	元素名	类型（约束）	必填	描述
            1	code	Int	Y	200成功 400失败
            2	partnerCode	String	N	合作伙伴code
            3	service	String	N	服务code
            4	message	String	N	失败时返回失败消息
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            sign=OGUzOWRhY2Y3N2JkYWNlMTZkOTNkMjI3NzYzNDVkOWU=&content={
                "waybillNo": "444069129271", 
                "customerAcctCode": "9999999999", 
                "childNos": "002803693071,002803693099,002803693080", 
                "orderNo": "1dc300ee-d5bb-465f-86ed-f3f82a326153", 
                "meterageWeightQty": 12.5, 
                "volume": 0, 
                "quantity": 4, 
                "feeList": [
                    {
                        "bizOwnerZoneCode": "755A", 
                        "currencyCode": "CNY", 
                        "customerAcctCode": "9999999999", 
                        "feeAmt": 1, 
                        "feeAmtInd": 1, 
                        "feeIndType": 0, 
                        "feeTypeCode": "3", 
                        "gatherEmpCode": "000212", 
                        "gatherZoneCode": "755A", 
                        "paymentChangeTypeCode": "0", 
                        "paymentTypeCode": "1", 
                        "serviceId": -1, 
                        "settlementTypeCode": "2", 
                        "versionNo": 0, 
                        "waybillId": -1, 
                        "waybillNo": "444069129271"
                    }, 
                    {
                        "bizOwnerZoneCode": "755A", 
                        "currencyCode": "CNY", 
                        "customerAcctCode": "9999999999", 
                        "feeAmt": 13.2, 
                        "feeAmtInd": 13.2, 
                        "feeIndType": 0, 
                        "feeTypeCode": "1", 
                        "gatherEmpCode": "000212", 
                        "gatherZoneCode": "755A", 
                        "inputTm": 1545203801000, 
                        "paymentChangeTypeCode": "0", 
                        "paymentTypeCode": "1", 
                        "settlementTypeCode": "2", 
                        "versionNo": 0, 
                        "waybillId": -1, 
                        "waybillNo": "444069129271"
                    }
                ], 
                "productName": "标准快递"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "code": 200,
                "partnerCode": "fengqiaoTest",
                "service": "",
                "msgData": ""
            }
            失败报文-范例1
            {
                "code": 400,
                "partnerCode": "fengqiaoTest",
                "service": "",
                "msgData": ""
            }
            */
            string code = "400";
            string message = "";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<RequestWaybillsFeePush>(body);
                if (request != null)
                {
                    reqData = request;
                    code = "200";
                }
                else
                {
                    reqData = null;
                    message = "接收数据转换成对象失败！";
                }
            }
            else
            {
                reqData = null;
                message = "接收数据为空！";
            }
            return new ResponseWaybillsFeePush()
            {
                code = code,
                message = message
            };
        }

        #endregion 注册推送类

        #region 服务查询类

        /// <summary>
        /// 顺丰服务网点查询接口
        /// 该接口支持客户根据运单号和图片类型进行注册，系统根据注册信息查询是否已经产生对应类型图片，如存在对应图片即生成对应推送任务，根据配置的推送地址推送对应图片信息。如对应图片推送失败，该接口会根据注册信息和推送任务进行重试。由于图片产生的时间不固定，建议在运单妥投后再来注册获取相应图片。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QueryGisDepartment(string partnerID, string checkword, MsgDataRequestQueryGisDepartment data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_QUERY_GIS_DEPARTMENT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQueryGisDepartment>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 运单号合法性校验接口
        /// 提供顺丰运单号合法性校验功能。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult ValidateWaybillno(string partnerID, string checkword, MsgDataRequestValidateWaybillno data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_VALIDATE_WAYBILLNO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseValidateWaybillno>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 预计派送时间接口
        /// 此功能主要是根据运单号查询预计派件时间。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SearchPromitm(string partnerID, string checkword, MsgDataRequestSearchPromitm data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_SEARCH_PROMITM";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseSearchPromitm>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 产品推荐接口
        /// 提供产品推荐接口的功能
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult PsdsProductRecommend(string partnerID, string checkword, MsgDataRequestPsdsProductRecommend data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_PSDS_PRODUCT_RECOMMEND";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponsePsdsProductRecommend>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 揽件服务时间查询接口
        /// 揽件服务时间查询
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CheckPickupTime(string partnerID, string checkword, MsgDataRequestCheckPickupTime data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_EXCE_CHECK_PICKUP_TIME";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseCheckPickupTime>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 增值服务推荐接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult PsdsRecommendVas(string partnerID, string checkword, MsgDataRequestPsdsRecommendVas data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_PSDS_RECOMMEND_VAS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponsePsdsRecommendVas>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单筛选接口
        /// 客户系统通过此接口向顺丰系统发送主动的筛单请求,用于判断客户的收、派地址是否属于顺丰的收派范围。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FilterOrderBsp(string partnerID, string checkword, List<MsgDataRequestFilterOrderBsp> data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_FILTER_ORDER_BSP";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFilterOrderBsp>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 时效标准及价格查询接口
        /// 客户可通过接口查询从特定原寄地寄特定目的地的时效和价格。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QueryDeliverTm(string partnerID, string checkword, MsgDataRequestQueryDeliverTm data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_QUERY_DELIVERTM";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQueryDeliverTm>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// GIS-RSS-ARS
        /// 通过输入的地址判断地址是否在顺丰派送区域
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult GisRssArs(string partnerID, string checkword, MsgDataRequestGisRssArs data, string accessToken = "", string environment = "bspgw")
        {
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_GIS_RSS_ARS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseGisRssArs>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            int status = msgDataResponse.status; // 状态码:0-成功，1-失败
                            if (status == 0)
                            {
                                errcode = "0";
                            }
                            else
                            {
                                var errorResult = JsonHelper.DeserializeObject<GisRssArsErrorResult>(msgDataResponse.result);
                                if (errorResult != null)
                                {
                                    errcode = errorResult.err;
                                    errmsg = errorResult.msg;
                                }
                                else
                                {
                                    errcode = "-3";
                                    errmsg = "返回业务数据失败";
                                }
                            }
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 服务查询类

        #region 终端驿站类

        /// <summary>
        /// 外部驿站派件预入库
        /// 外部驿站通过此接口进行预入库操作。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbPreHandoverPack(string partnerID, string checkword, MsgDataRequestKbPreHandoverPack data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：


            #	属性名	类型（约束）	必填	默认值	描述
            1			是		
            2	errorCode	String	否		
            3		String	否		
            4	obj	object	否		
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                     "obj": {
                           "msg": "预入库成功"
                    }
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "-161",
                    "errorMessage": "未找到当前门店信息或处于非审核通过状态"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_PRE_HANDOVER_PACK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbPreHandoverPack>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 外部驿站派件入库
        /// 外部驿站通过此接口进行入库（657）操作。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbHandoverPack(string partnerID, string checkword, MsgDataRequestKbHandoverPack data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	success	boolean	是		成功返回 true;失败返回 false
            2	errorCode	String	否		错误编码
            3	errorMessage	String	否		错误描述
            4	obj	object	否		obj 响应内容
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                         "msg": "推送657路由成功"
                    }
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "-160",
                    "errorMessage": "驿站不存在或已删除或未审核通过"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_HANDOVER_PACK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbHandoverPack>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 外部驿站派件出库
        /// 外部驿站通过此接口进行出库（658）操作。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbCustRecPack(string partnerID, string checkword, MsgDataRequestKbCustRecPack data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3 业务数据报文
            msgData 参数对应对象字段信息

            #	属性名	类型（约束）	必填	说明	描述
            1	partner_id	string	是	合作伙伴ID（顺丰分配）	SKSS提供
            2	store_code	string	是	外部驿站的唯一编码（外部系统）	
            3	waybill_no	string	是		顺丰运单号
            4	extendJson	string	否		业务扩展 json 字符串
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	success	boolean	是		成功返回 true;失败返回 false
            2	errorCode	String	否		错误编码
            3	errorMessage	String	否		错误描述
            4	obj	object	否		obj 响应内容
            2.5. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "partner_id":"OUTSIDETEST",
                "waybill_no":"SF1407551503770",
                "store_code":"TEST2094091"
            }
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                         "msg": "派件出库成功"
                    }
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "-161",
                    "errorMessage": "未找到当前门店信息或处于非审核通过状态"
                }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_CUST_REC_PACK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbCustRecPack>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿站运单批量盘点
        /// 通过此接口可批量对便利店运单上传 600 路由(滞留件盘点)。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbWillbillbussExpressCheck(string partnerID, string checkword, MsgDataRequestKbWillbillbussExpressCheck data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            #	属性名	类型（约束）	必填	默认值	描述
            1	msg	String	否		提示信息
            2	failList	List<FailResult>	否		
            failList 集合中的 FailResult 类型包含以下字段：

            #	属性名	类型（约束）	必填	默认值	描述
            1	waybill_no	String	是		运单号
            2	reason	String	是		
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（至少有一个运单成功时，success 为 true，当 failList 集合为空时表示全部运单操作成功）:
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": true,
                "obj": {
                  "msg": "部分操作成功",
                  "failList": [
                    {
                      "reason": "客户已签收不允许盘点",
                      "waybill_no": "033222868176"
                    },
                    {
                      "reason": "客户已签收不允许盘点",
                      "waybill_no": "033222868177"
                    }
                  ]
                }
              }
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "errorCode": "-255",
                "errorMessage": "全部操作失败",
                "obj": {
                    "msg": "全部操作失败",
                    "failList": [
                        {
                            "reason": "{'msg':'当前快件信息未入库，提交数据失败'}",
                            "waybill_no": "033588998564"
                        },
                        {
                            "reason": "本日已盘点600",
                            "waybill_no": "033588998246"
                        }
                    ]
                },
                "success": false
              }
            }  
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_WILLBILLBUSS_EXPRESS_CHECK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbWillbillbussExpressCheck>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿站异常件退件处理
        /// 异常件处理。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbWillbillbuss659(string partnerID, string checkword, MsgDataRequestKbWillbillbuss659 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.2. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.3. 响应参数<apiResultData>
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            2.5. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	
                "apiErrorMsg":"",
                "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode":"A1000",
                "apiResultData":{
                    "success": true
                }
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
              {
                "errorCode": "-162",
                "errorMessage": "当前快件信息未入库，提交数据失败",
                "success": false
               }
            }  
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_WILLBILLBUSS_659";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbWillbillbuss659>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 新增/修改外部驿站
        /// 外部供应商通过此接口新增或修改外部驿站。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbStoreSave(string partnerID, string checkword, MsgDataRequestKbStoreSave data, string accessToken = "", string environment = "bspgw")
        { 
            /*	
            2.5. 请求示例\应用场景(JSON)示例
            请求报文:

            新增驿站请求参数

            {
                "name": "外部驿站南山店",
                "partnerId": "KBWL8S6H",
                "storeCode": "OUT01001",
                "storeType": 201,
                "linkman": "张三",
                "phone": "13800000021",
                "telephone": "021-59823830",
                "serviceTime": "07:59--19:00",
                "lng": 113.940887,
                "lat": 22.524536,
                "provincename": "广东省",
                "cityname": "深圳市",
                "countyname": "南山区",
                "townname": "粤海街道",
                "address": "软件基地1栋",
                "businessScope":1,
                "square":220.75
                "areaType":4,
                "administrativeAreaType":1,
                "isDelete":0
            }

            修改驿站请求参数

            {
                "virtualAddr":"VR01001"
                "name": "外部驿站南山店",
                "partnerId": "KBWL8S6H",
                "storeCode": "OUT01001",
                "storeType": 201,
                "linkman": "张三",
                "phone": "13800000021",
                "telephone": "021-59823830",
                "serviceTime": "07:59--19:00",
                "lng": 113.940887,
                "lat": 22.524536,
                "provincename": "广东省",
                "cityname": "深圳市",
                "countyname": "南山区",
                "townname": "粤海街道",
                "address": "软件基地1栋",
                "businessScope":1,
                "square":220.75
                "areaType":4,
                "administrativeAreaType":1,
                "isDelete":0
            }
        
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData中字段及含义详见丰声开发平台文档：
            http://open-funsionwork.sf-express.com/books/docs/swarmsRobot/sendMsg.html
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj":"OUT01001"
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "0",
                    "errorMessage": "门店OUT01001不存在，更新失败"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_STORE_SAVE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbStoreSave>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = msgDataResponse.obj;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 外部驿站上传营业执照、末端备案、相册
        /// 通过此接口外部驿站上传营业执照、末端备案、相册。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="greymark">为了进行灰度，请在请求头中添加greymark字段，greymark取值按如下格式： partnerid=YSF001&areacode=769Y&deptcode=755A&storecode=AAAAAAA&
        /// 如某字段无法取到，填充为default
        /// 例如，deptcode无法取到，greymark按照如下传值 partnerid = YSF001 & areacode = 769Y&deptcode=default&storecode=AAAAAAA&</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbStoreImgAdd(string partnerID, string checkword, MsgDataRequestKbStoreImgAdd data, string greymark, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "0",
                    "errorMessage": "上传照片失败"
                }
            }  
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_STORE_IMG_ADD";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbStoreImgAdd>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 外部驿站发送短信
        /// 外部驿站通过此接口短信发送操作。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbSendSms(string partnerID, string checkword, MsgDataRequestKbSendSms data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.5. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "partner_id":"OUTSIDETEST",
                "store_code":"TEST2094091",
                "waybill_no":"SF1125080253347",
                "pick_up_code":"5131",
                "sms_template":"1"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	success	boolean	是		成功返回 true;失败返回 false
            2	errorCode	String	否		错误编码
            3	errorMessage	String	否		错误描述
            4	obj	object	否		
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                         "msg": "短信发送成功",
                         "sms_id":"b386fe77e48f4b889d2878e186b0944a"
                   }
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "-162",
                    "errorMessage": "是顺丰运单，无收件人手机号码"
                }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_SEND_SMS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbSendSms>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 外部驿站运单校验
        /// 外部驿站通过此接口对顺丰运单进行合法性校验。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult KbWaybillCheck(string partnerID, string checkword, MsgDataRequestKbWaybillCheck data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	success	boolean	是		成功返回 true;失败返回 false
            2	errorCode	String	否		错误编码
            3	errorMessage	String	否		错误描述
            4	obj	object	否		obj 响应内容
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                         "msg": "是顺丰运单，能代发短信",
                         "phone": "2134"
                   }
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "-161",
                    "errorMessage": "是顺丰运单，不能代发短信"
                }
            }  
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_KB_WAYBILL_CHECK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseKbWaybillCheck>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿站暂存
        /// 通过此接口上传210（派端驿站暂存）或410（收端驿站暂存）。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="greymark">为了进行灰度，请在请求头中添加greymark字段，greymark取值按如下格式： partnerid=YSF001&areacode=769Y&deptcode=755A&storecode=AAAAAAA&
        /// 如某字段无法取到，填充为default 例如，deptcode无法取到，greymark按照如下传值 partnerid=YSF001&areacode=769Y&deptcode=default&storecode=AAAAAAA&</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult TempStore(string partnerID, string checkword, string greymark, MsgDataRequestTempStore data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.5. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "bill_type": "2",
                "agent_code": "145205",
                "partner_id": "ZSHM77YF",
                "waybill_no": "033222868176"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.6. 返回示例\应用场景(JSON)示例
            响应报文:

            成功时响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true
                }
            }
            失败时响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "-161",
                    "errorMessage": "未找到当前门店信息或处于非审核通过状态"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_TEMP_STORE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;
            if(!string.IsNullOrWhiteSpace(greymark))
            {
                content["greymark"] = greymark;
            }

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseTempStore>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 品牌巡检相册新增
        /// 通过此接口上传210（派端驿站暂存）或410（收端驿站暂存）。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult BrandInspAddImages(string partnerID, string checkword, MsgDataRequestBrandInspAddImages data, string accessToken = "", string environment = "bspgw")
        {
            /*
            1.2 名词说明
            名称	说明
            SF	顺丰速运
            CP	Cooperative partner，顺丰合作伙伴 

            2.2 CP请求SF公共参数
            参数列表	类型	是否必传	含义
            partnerID	String(64)	Y	顾客编码（由顺丰分配）
            requestID	String(40)	Y	请求唯一号UUID
            serviceCode	String(50)	Y	接口服务代码（COM_RECE_BRAND_INSP_ADD_IMAGES)
            timestamp	long	Y	调用接口时间戳
            msgDigest	String(128)	Y	数字签名
            msgData	String	Y	业务数据报文（报文类型：json）
            nonce	int	N	调用接口随机数
            fromCode	Stirng(50)	N	调用平台编码
            versionNo	Stirng(20)	N	版本号
            3 业务数据报文
            msgData 参数对应对象字段信息

            #	属性名	类型（约束）	必填	描述
            1	taskId	String	是	品牌巡检任务ID（多次传同一taskId表示修改该任务的图片）
            2	virtualAddr	String	是	驿站ID
            3	partnerId	String	是	合作伙伴ID（注意区别丰桥的重名参数，例YSF14SD1）
            4	extendJson	String	否	业务扩展json字符串
            5	backgroundFileNames	List<String>	是	驿站外观文件名称（最多10张）
            6	licenseFileNames	List<String>	是	营业执照文件名称（最多10张）
            7	doorHead	List<String>	否	门头文件名称（序号7至21为区域外包门店的字段，非必传，每种图片类型暂只支持1张）
            8	lightBox	List<String>	否	灯箱文件名称
            9	imageWall	List<String>	否	形象墙文件名称
            10	girdle	List<String>	否	腰封玻璃贴文件名称
            11	cooperationLicense	List<String>	否	授权合作牌文件名称
            12	businessPoster	List<String>	否	业务介绍海报文件名称
            13	pickupPoster	List<String>	否	自助取件海报文件名称
            14	pickupDesk	List<String>	否	寄取件台卡文件名称
            15	wallSystem	List<String>	否	上墙制度文件名称
            16	hangingFlags	List<String>	否	吊旗8面文件名称
            17	receptionDesk	List<String>	否	接待台文件名称
            18	shelfStickers	List<String>	否	货架贴文件名称
            19	indication	List<String>	否	指示类文件名称
            20	tips	List<String>	否	提示类文件名称
            21	cartonDesk	List<String>	否	纸箱回收台文件名称
            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容

            业务处理结果详细参数：
            参数列表	类型	是否必传	含义
            partnerID	String(64)	Y	顾客编码（由顺丰分配）
            requestID	String(40)	Y	请求唯一号UUID
            serviceCode	String(50)	Y	接口服务代码（COM_RECE_BRAND_INSP_ADD_IMAGES)
            timestamp	long	Y	调用接口时间戳
            msgDigest	String(128)	Y	数字签名
            msgData	String	Y	业务数据报文（报文类型：json）
            nonce	int	N	调用接口随机数
            fromCode	Stirng(50)	N	调用平台编码
            versionNo	Stirng(20)	N	版本号 

            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            6 应用JSON实例
            场景描述：驿站信息查询

            msgData对应请求的JSON字符串:
            {
                "taskId": "asdbkasbdkasbd12312",
                "virtualAddr": "SF18688980999",
                "partnerId": "YSF14SD1",
                "backgroundFileNames": [
                    "000748def4594ee49424f565304920d1.png",
                    "000e0813c4e64bf7947f24ad040b05eb.png"
                ],
                "licenseFileNames": [
                    "001355ba1e16410a816cbbc16a6f9b8d.png",
                    "0020eec682504657ad33c981c427dda5.png"
                ],
                "doorHead": [
                    "001355ba1e16410a816cbbc16a6f9b8d.png"
                ]
            }
            响应JSON：

            请求正常的：

            {
               "apiErrorMsg": "",
               "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
               "apiResultCode": "A1000",
               "apiResultData": {
                   "success": true
               }
            }
            请求异常的：

            {
               "apiErrorMsg": "",
               "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
               "apiResultCode": "A1000",
               "apiResultData": {
                   "errorCode": "TOAP2001",
                   "errorMessage": "门店不存在或已删除",
                   "success": false
               }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_BRAND_INSP_ADD_IMAGES";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseBrandInspAddImages>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 乡镇代理基本信息新增
        /// 驿站基本信息新增 。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddVillageStoreInfo(string partnerID, string checkword, MsgDataRequestEosAddVillageStoreInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
		            "accessCode":""
                },
                "content":{
                    "storeCode":"",
                    "partnerId":"", 
                    "siteStatus":""
                }
            }
            
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	virtualAddr	String	否		代理点ID
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_VILLAGE_STORE_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddVillageStoreInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 乡镇代理图片上传
        /// 驿站相册新增
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddVillageStoreImg(string partnerID, string checkword, MsgDataRequestEosAddVillageStoreImg data, string accessToken = "", string environment = "bspgw")
        {
            /*
            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容 
            
            6 应用JSON实例
            场景描述：驿站信息查询

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "outerImageFileNames": [
                        "000748def4594ee49424f565304920d1.png",
                        "000e0813c4e64bf7947f24ad040b05eb.png"
                    ],
                    "innerImageFileNames": [
                        "001355ba1e16410a816cbbc16a6f9b8d.png",
                        "0020eec682504657ad33c981c427dda5.png"
                    ],
                    "virtualAddr": "SF15118020019"
                }
            }
            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"success\":true}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_VILLAGE_STORE_IMG";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddVillageStoreImg>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 顺丰单号校验
        /// 外部供应商通过此接口校验运单号是否为顺丰运单号。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult VerifyWaybillNumber(string partnerID, string checkword, MsgDataRequestVerifyWaybillNumber data, string accessToken = "", string environment = "bspgw")
        {
            /* 
            2.6. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
              "api": "verify_waybill_number",
              "partner_id": "MYJ2U352",
              "waybill_no": "033222868176"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            成功时（即success为true），有obj 响应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	msg	String	否	提示信息
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（success 为 true）:
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": true,
                "obj": {
                  "msg": "合法顺丰运单号"
                }
              }
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": false,
                "errorCode": "-121",
                "errorMessage": "非法顺丰运单号"
              }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_VERIFY_WAYBILL_NUMBER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseVerifyWaybillNumber>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 查询运单路由
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QueryWaybillRoute(string partnerID, string checkword, MsgDataRequestQueryWaybillRoute data, string accessToken = "", string environment = "bspgw")
        {
            /* 
            2.6. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
                "api": "query_waybill_route",
                "partner_id": "MYJ2U352",
                "waybill_no": "033222868176"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            成功时（即success为true），有obj 响应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	waybill_no	String	否	运单号
            2	route	List<Route>	否	路由集合
            Route对象包含的字段信息

            #	属性名	类型（约束）	必填	描述
            1	date	String	否	巴枪扫描日期
            2	time	String	否	巴枪扫描时间
            3	state	String	否	监控记录
            4	position	String	否	所在城市
            5	oprCode	String	否	操作员工号
            6	opCode	String	否	操作码
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（success 为 true）:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                        "waybill_no": "033222868176",
                        "route": [
                            {
                                "date": "2022-06-08",
                                "oprCode": "SF13925563806",
                                "opCode": "658",
                                "time": "11:08:37",
                                "state": "快件领取成功",
                                "position": ""
                            },
                            {
                                "date": "2022-06-08",
                                "oprCode": "948469",
                                "opCode": "80",
                                "time": "11:08:52",
                                "state": "您的快件已签收，如有疑问请电联快递员【948469，电话：13700000001】。疫情期间顺丰每日对网点消毒、快递员每日测温、配戴口罩，感谢您使用顺丰，期待再次为您服务。（主单总件数：1件）",
                                "position": "深圳市"
                            }
                        ]
                    }
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                "success": false,
                "errorCode": "-50",
                "errorMessage": "运单号无效"
                }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_QUERY_WAYBILL_ROUTE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQueryWaybillRoute>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 通知收件人
        /// 外部供应商调用该接口向收件人发送通知短信。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult NotifyRec(string partnerID, string checkword, MsgDataRequestNotifyRec data, string accessToken = "", string environment = "bspgw")
        {
            /* 
            2.6. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
                "api": "notify_receiver",
                "partner_id": "MYJ2U352",
                "waybill_no": "033222868176",
                "agent_code": "5726"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            成功时（即success为true），有obj 响应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	msg	String	否	提示信息
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（success 为 true）:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "obj": {
                        "msg": "通知短信发送成功"
                    },
                    "success": true
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "errorCode": "-171",
                    "errorMessage": "顺丰运单号不合法",
                    "success": false
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_NOTIFY_REC";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseNotifyRec>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 验证取件密码
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WalidateDeliveryPwd(string partnerID, string checkword, MsgDataRequestWalidateDeliveryPwd data, string accessToken = "", string environment = "bspgw")
        {
            /* 
            2.6. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
                "api": "notify_receiver",
                "partner_id": "MYJ2U352",
                "waybill_no": "033222868176",
                "agent_code": "5726"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            查询成功时（即success为true），有obj 响应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	msg	String	否	提示信息
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（success 为 true）:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "obj": {
                        "msg": "取件密码验证通过"
                    },
                    "success": true
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "errorCode": "-74",
                    "errorMessage": "取件密码验证不通过",
                    "success": false
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_VALIDATE_DELIVERY_PWD";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseWalidateDeliveryPwd>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 发送短信
        /// 外部供应商调用该接口向收件人或寄件人发送固定模板的通知短信。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SendSmsByWaybill(string partnerID, string checkword, MsgDataRequestSendSmsByWaybill data, string accessToken = "", string environment = "bspgw")
        {
            /*
            当sent_to=1时（向收件人发送通知短信），可传门店地址、门店手机号、取件码，这些参数放在extendJson中，extendJson包含的字段定义如下：

            #	属性名	类型（约束）	必填	描述
            1	storeAddress	String	否	门店地址，如不传则以顺丰SKSS维护的信息为准
            2	storePhone	String	否	门店手机号，如不传则以顺丰SKSS维护的信息为准
            3	pickupCode	String	否	取件码，如不传则取件短信不包含取件码信息
            短信模板

            send_to	模板内容（大括号内为动态变更内容，短信不包含大括号）
            sent_to=1，向收件人发送	【顺丰速运】您好，您的顺丰包裹{SF123456789}已放置于：{坂田街道禾坪岗禾坪路30号101店铺}，取件联系电话{18888888888}，{取件码为123456，}请及时取件
            sent_to=2，向寄件人发送	【顺丰速运】您委托{近邻宝}[{内蒙古师范大学盛乐校区}]店的快件已寄出，快递单号{SF123456789}，详情可登陆顺丰官网或致电95338查询

            2.6. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
                "api": "send_sms_by_waybill",
                "partner_id": "ZKFCL0J1",
                "waybill_no": "033483742599",
                "agent_code": "JLB1405220034",
                "send_to": "1",
                "mobile_phone": "18888888888",
                "extendJson": "{\"storeAddress\":\"这是门店的地址\",\"storePhone\":\"19999999999\",\"pickupCode\":\"Aa-147258\"}"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            成功时（即success为true），有obj 响应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	msg	String	否	提示信息
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（success 为 true）:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "obj": {
                        "msg": "短信发送成功"
                    },
                    "success": true
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "errorCode": "-51",
                    "errorMessage": "运单号不存在",
                    "success": false
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_SEND_SMS_BY_WAYBILL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseSendSmsByWaybill>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 通用查询接口
        /// 外部供应商调用该接口向收件人或寄件人发送固定模板的通知短信。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QueryCentralizeExpress(string partnerID, string checkword, MsgDataRequestQueryCentralizeExpress data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.3 业务数据报文
            msgData 参数对应对象字段信息：
            #	属性名	类型（约束）	必填	描述
            1	api	String	是	调用接口
            2	partner_id	String	是	SKSS维护的合作伙伴ID（注意区分丰桥的顾客编码）
            3	params	Object	是	业务参数（见2.5）
            4	extendJson	String	否	业务扩展 json 字符串
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5 业务请求参数与相应
            */

            /*
            2.5.1 集收集派查询
            详情
            2.5.1.1.请求参数
            (1)api：query_centralize_express
            (2)params:
            #	属性名	类型（约束）	必填	描述
            1	type	Integer	是	1：集收件查询；2：集派件查询
            2	waybill_no	String	是	运单号
            2.5.1.2.响应参数
            成功时（即success为true），有obj 响应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	api	String	否	接口类型
            2	resultMsg	List<Route>	否	Json字符串
            resultMsg对象包含的字段信息

            #	属性名	类型（约束）	必填	描述
            1	isCentralism	boolean	否	是否集中件
            2.5.1.3.返回示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
              "api": "query_waybill_route",
              "partner_id": "MYJ2U352",
              "params": {      
                    "type": 1,
                    "waybill_no" : "123455
              }
            }
            响应报文:

            成功响应（success 为 true）:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                        "api": "query_centralizee_xpress ",  
                    "resultMsg":{
                    isCentralism: true
                     }
                    }
                }
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": false,
                "errorCode": "-50",
                "errorMessage": "运单号无效"
              }
            }
            2.5.1.4.业务异常代码
            原因代码	代码
            -180	必传参数不可为空
            -181	partner_id参数不合法
            -182	params参数不合法
            -183	type参数不合法
            -184	运单号不合法
            -185	未获取到sisp运单信息
            */

            /*
            2.5.2 区域外包信息变更接口
            详情
            2.5.2.1.请求参数
            (1)api：outsource_info_api
            (2)params:
            #	属性名	类型（约束）	必填	描述
            1	deptCode	String	是	网点代码
            2	outAoiAreaCode	String	是	aoi区域编码（多个使用;分隔）
            3	biddingCreateTm	String	否	发标时间（格式:yyyy-MM-dd）
            4	biddingWinTm	String	否	中标时间（格式:yyyy-MM-dd）
            5	employerEmpNo	String	是	雇主工号
            6	employerEmpName	String	是	雇主姓名
            7	employerPhone	String	否	雇主联系方式
            8	supplierCode	String	是	外包供应商编码
            9	serviceState	String	是	服务状态(1-服务中;2-已退出)
            10	serviceSignState	Integer	是	服务协议签约状态（1-已签约;2-签约中;3-取消合作）
            11	serviceSignTm	String	是	首次合同生效时间（格式:yyyy-MM-dd）
            12	contractBeginDate	String	是	合同生效时间（格式:yyyy-MM-dd）
            13	contractEndDate	String	是	合同失效时间（格式:yyyy-MM-dd）
            14	employeeNoDetail	String	是	雇员工号（多个使用;分隔）
            15	thisMonthLeaveEmployee	String	是	本月离职雇员工号（多个使用;分隔）
            16	lastMonthLeaveEmployee	String	是	上月离职雇员工号（多个使用;分隔）
            17	singlePickupAward	Double	否	收件单票外包激励
            18	singleDeliverAward	Double	否	派件单票外包激励
            19	contractRenew	Integer	是	合同是否续签（0-新签;1-续签）
            20	cancerServeReason	String	否	退出原因描述，服务协议签约状态为取消合作时必传
            21	markCode	String	是	标的编码
            22	osMode	Integer	是	外包模式(1-员工自租;2-共配外包;3-独营外包;4-区域外包-服务商)
            23	exitType	Integer	否	退出类型(1-主动退出;2-被动退出)，服务协议签约状态为取消合作时必传
            24	exitReasonType	String	否	退出原因归类(小于200字符)，服务协议签约状态为取消合作时必传
            25	exitDate	String	否	退出时间（格式:yyyy-MM-dd），服务协议签约状态为取消合作时必传
            26	exitEmployeeDestination	String	否	退出员工去向(小于200字符)，服务协议签约状态为取消合作时必传
            27	preExitStatus	Integer	否	预退出状态 1、预退出 2、取消预退出
            28	preExitTime	String	否	预退出时间，格式为yyyy-MM-dd HH:mm:ss，比如2024-04-23 16:40:00
            #	属性名	类型（约束）	必填	描述
            1	success	boolean	是	
            2.5.2.2.响应参数
            #	属性名	类型（约束）	必填	描述
            1	success	boolean	是	
            2.5.2.3.返回示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
              "api": "yjy_outsource_info_api",
              "partner_id": "YSF1234",
              "params": 
                {
                    "deptcode": "755A", 
                    "outAoiAreaCode": "755A001;755A018", 
                    "biddingCreateTm": "2023-05-10", 
                    "biddingState": 2, 
                    "biddingWinTm": "2023-08-01", 
                    "intentSignState": 1, 
                    "employerEmpName": "苏国华", 
                    "employerEmpNo": "95869722", 
                    "employerPhone": "15217651234", 
                    "supplierCode": "IA381", 
                    "serviceState": 1, 
                    "serviceSignState": 1, 
                    "serviceSignTm": "2011-02-20", 
                    "contractBeginDate": "2011-02-20", 
                    "contractEndDate": "2015-03-20", 
                    "employeeNoDetail": "95869721;95869720", 
                    "singlePickupAward": 5, 
                    "singleDeliverAward": 23, 
                    "markCode": "755Y0009", 
                    "thisMonthLeaveEmployee": "", 
                    "lastMonthLeaveEmployee": "", 
                    "contractRenew": 1,
                    "preExitStatus": 1,
                    "preExitTime": "2024-04-23 16:40:00"
                }
            }
            响应报文:

            成功响应（success 为 true）:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true
                }
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": false,
                "errorCode": "-190",
                "errorMessage": "网点代码不合法"
              }
            }
            2.5.2.4.业务异常代码
            原因代码	代码
            -180	必传参数不可为空
            -181	partner_id参数不合法
            -182	params参数不合法
            -183	type参数不合法
            -190	网点代码不合法
            -191	雇主工号不存在
            -192	雇主工号对应姓名错误
            -193	外包aoi区域编码已存在
            -194	该标的编码关联的区域外包不是服务商类型
            -195	服务协议签约状态为取消合作时相应字段需必传
            */

            /*
            2.5.3 渠道新增/修改接口
            详情
            （1）params包含的字段信息

            #	属性名	类型（约束）	必填	描述
            1	channelType	string	是	渠道类型，9=机器人/智能柜
            2	openStoreInfo	object	是	参数对象
            （2）openStoreInfo包含的字段信息

            #	属性名	类型（约束）	必填	描述
            1	virtualAddr	String	条件	顺丰生成的唯一编码。新增时不传，修改时必传
            2	name	String	是	智能柜/机器人名称
            3	manufactor	String	是	厂商
            4	storeCode	String	是	硬件ID（机器人编码），最长32字符
            5	status	Integer	是	状态，0使用中，1未使用
            6	serviceBeginDate	String	是	开始营运日期，格式yyyy-MM-dd
            7	deviceForbiddenDate	String	是	设备禁用时间，格式yyyy-MM-dd
            8	linkman	String	是	联系人
            9	phone	String	是	联系方式
            10	maxGridCount	Integer	否	柜机最大格口数
            11	serviceContentType	Integer	是	服务类型， 1可自寄，2可自取，3可自寄可自取
            12	provincename	String	是	省
            13	cityname	String	是	市
            14	countyname	String	是	区/县
            15	townname	String	是	乡镇/街道
            16	address	String	是	详细地址
            17	storeType	Integer	是	设备类型，30=机器人，31=智能柜
            18	extendJson	String	否	后续扩展字段以json格式提交
            （3）apiResultData响应参数

            成功时，success=true，obj有值：
            #	属性名	类型（约束）	必填	默认值	描述
            1	virtualAddr	String	是		顺丰生成的唯一编码，后续更新时需带上该值
            失败时，success=false，errorCode和errorMessage有值。
            （4）请求报文示例:

            新增请求参数
            {
                "api": "robot_add_or_update",
                "partnerId": "YJ12345",
                "params": {
                    "channelType": "9",
                    "openStoreInfo": {
                        "name": "机器人A",
                        "manufactor": "云际机器人",
                        "storeCode": "12beo1287eWDIPUPd",
                        "status": 1,
                        "serviceBeginDate": "2023-08-28",
                        "deviceForbiddenDate": "2023-09-28",
                        "linkman": "李华",
                        "phone": "13812341234",
                        "maxGridCount": 6,
                        "serviceContentType": 2,
                        "provincename": "广东省",
                        "cityname": "深圳市",
                        "countyname": "南山区",
                        "townname": "南山街道",
                        "address": "创智天地大厦29楼",
                    "storeType": 30
                    }
                }
            }

            修改驿站请求参数
            {
                "api": "robot_add_or_update",
                "partnerId": "YJ12345",
                "params": {
                    "channelType": "9",
                    "openStoreInfo": {
                        "virtualAddr": "SF30012341234",
                        "name": "机器人A",
                        "manufactor": "云际机器人",
                        "storeCode": "12beo1287eWDIPUPd",
                        "status": 1,
                        "serviceBeginDate": "2023-08-28",
                        "deviceForbiddenDate": "2023-09-28",
                        "linkman": "李华",
                        "phone": "13812341234",
                        "maxGridCount": 6,
                        "serviceContentType": 2,
                        "provincename": "广东省",
                        "cityname": "深圳市",
                        "countyname": "南山区",
                        "townname": "南山街道",
                        "address": "创智天地大厦29楼",
                    "storeType": 30
                    }
                }
            }

            （5）响应报文示例:

            成功时响应:

            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                        "virtualAddr": "SF30012341234"
                    }
                }
            }
            失败时响应：

            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "0",
                    "errorMessage": "硬件ID重复"
                }
            }
            */

            /*
            2.5.4 笼车柜新增/更新
            详情
            （1）params包含的字段信息

            #	属性名	类型（约束）	必填	描述
            1	sn	String	是	柜机终端号，以sn为主键，若已存在则为更新
            2	cabinetCode	String	是	柜机编码
            3	lng	String	是	经度
            4	lat	String	是	维度
            5	gridNum	Integer	是	格口数量
            6	provincename	String	是	省
            7	cityname	String	是	市
            8	countyname	String	是	区/县
            9	townname	String	是	乡镇/街道
            10	address	String	是	详细地址
            11	status	Integer	是	笼车柜状态（1:使用中/2:维护中/3:弃用）
            12	communityName	String	否	社区名称
            13	extendJson	String	否	后续扩展字段以json格式提交
            （3）apiResultData响应参数

            成功时，success=true。
            （4）请求报文示例:

            仅给出msgData包含的字段信息
            {
                "api": "cageCabinet_add_or_update",
                "partnerId": "FCKJU7H5",
                "params": {
                    "sn": "100000000000001",
                    "cabinetCode": "FC00000001",
                    "lng": "114.685461",
                    "lat": "74.2456115",
                    "gridNum": 5,
                    "provincename": "广东省",
                    "cityname": "深圳市",
                    "countyname": "南山区",
                    "townname": "南山街道",
                    "address": "创智天地大厦B栋",
                    "status": 1,
                    "communityName": "xx"
                }
            }

            （5）响应报文示例:

            成功时响应:

            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true
                }
            }
            失败时响应：

            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "0",
                    "errorMessage": "根据地址未查到网点编码"
                }
            }  
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_QUERY_CENTRALIZE_EXPRESS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQueryCentralizeExpress>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 派件管控接口
        /// 判断该渠道和操作员是否可以派件。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult DeliveryOperationVerify(string partnerID, string checkword, MsgDataRequestDeliveryOperationVerify data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.5. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:
            {
                "sgs_username": "000212",
                "sgs_netcode": "755Q",
                "sgs_distcode": "755",
                "waybillNo": "033143808114",
                "channel": "HKFC"
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	描述
            1	success	boolean	是	成功返回 true;失败返回 false
            2	errorCode	String	否	错误代码
            3	errorMessage	String	否	错误描述
            4	obj	String	否	obj 结果对象（operationControl：0不管控，1管控；reasonCode：管控原因代码；reason：管控原因说明）
            obj 结果对象：
            #	属性名	类型（约束）	必填	描述
            1	operationControl	String	是	是否管控（0不管控，1管控）
            2	reason	String	否	控原因说明
            3	reasonCode	String	否	管控原因代码
            2.6. 返回示例\应用场景(JSON)示例
            响应报文（仅给出apiResultData）:

            成功响应（success 为 true）:
            1.不管控

            {
                "success": true,
                "obj": {
                    "operationControl": "0"
                }
            }
            2.管控

            {
                "success": true,
                "obj": {
                    "operationControl": "1",
                    "reasonCode": "ERR_SDS_NEW_MODEL_DELIVERY",
                    "reason": "新模式件,需指定运力交接;非配送员岗位,不限制可以交接!"
                }
            }
            失败响应：
            {
                "success": false,
                "errorCode": "D0",
                "errorMessage": "系统异常."
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_DELIVERY_OPERATION_VERIFY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseDeliveryOperationVerify>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 丰巢订单结算校验
        /// 校验丰巢柜投柜、租赁和预约等费用是否月结。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FcSettleVerify(string partnerID, string checkword, MsgDataRequestFcSettleVerify data, string accessToken = "", string environment = "bspgw")
        {
            /*
            type=1派件投柜时（丰巢保证已租用/预约的投柜不会调该接口），data的字段为：：
            #	属性名	类型（约束）	必填（哪些opType必填）	描述（key表示与月结校验相关）
            1	opType	int	是1、2	操作类型(key)，1投柜，2放弃投柜
            2	orderId	string	是1、2	订单号(key)
            3	cabinetCode	string	是1	服务站/柜机编码(key)
            4	empNo	string	是1	顺丰工号(key)
            5	phone	string	是1	手机号(key)
            6	paymentType	int	是1	支付方式(key)，1=“网点钱包（公司月结）”

            7	waybillNo	string	是1	运单号(key)
            8	gridType	int	是1	格口类型，1-大，2-中，3-小
            9	discountType	string	否1	优惠描述
            10	discountFee	int	否1	优惠金额(key)，单位分
            11	payedFee	int	是1	收费金额(key)，单位分
            12	deliverTm	string	是1	派件时间(key)，格式yyyy-MM-ddHH:mm:ss
            13	extendJson	string	否	业务扩展 json 字符串
            type=2个人租用和type=3网点批量租用时（两种都可能租多台柜机），data的字段为：
            #	属性名	类型（约束）	必填（哪些opType必填）	描述
            1	opType	int	是all	操作类型(key)，1租赁，2租赁失败（终态），3租赁全部成功，4租赁部分成功，5取消租赁（终态）。备注：1租赁是父订单维度只有一次；2-5为子订单维度（父订单号+柜机）,即每个柜机均可独立操作2-5
            2	orderId	string	是all	父订单号(key)
            3	cabinetCode	string	是1；2、3、4、5	柜机编码(key)
            4	empNo	string	是1	顺丰工号(key)
            5	phone	string	是1	手机号(key)
            6	paymentType	int	是1	支付方式(key)，1=“网点钱包（公司月结）”

            7	orderGridNums	List<object>	是1	下单格口总数量，字段为：格口类型gridType（1-大，2-中，3-小），格口数量num，如[{“gridType”:1,“num”:1},{“gridType”:2,“num”:2}]
            8	successGridNums	List<object>	是3、4	单个柜机成功格口数量，字段为：格口类型gridType（1-大，2-中，3-小），格口数量num，如[{“gridType”:1,“num”:1},{“gridType”:2,“num”:2}]
            9	orderTm	string	是1	下单时间(key)，格式yyyy-MM-ddHH:mm:ss
            10	paymentTm	string	是1	支付时间，格式yyyy-MM-dd HH:mm:ss
            11	rentTm	string	是1	租用时间，如2023-01-07 00:00:00-2023-01-12 23:59:59
            12	refundTm	string	是2、4、5	单个柜机退款时间(key)，格式yyyy-MM-dd HH:mm:ss
            13	orderFee	int	是1	父订单总金额(key)，单位分
            14	refundFee	int	是2、4、5	单个柜机单次退款金额(key)，单位分
            15	extendJson	string	否	业务扩展 json 字符串
            type=4预约时，data的字段为：
            #	属性名	类型（约束）	必填（哪些opType必填）	描述
            1	opType	int	是all	操作类型(key)，1预约，2预约失败（终态），3预约成功（终态），4部分预约成功（终态），5预约取消（终态）
            2	orderId	string	是all	订单号(key)
            3	cabinetCode	string	是1	柜机编码(key)
            4	empNo	string	是1	顺丰工号(key)
            5	phone	string	是1	手机号(key)
            6	paymentType	int	是1	支付方式(key)，1=“网点钱包（公司月结）”

            7	apptPeriod	string	是1	预约时段(分钟)
            8	apptTm	string	是2、3、4	预约生效时间，如2023-01-07 12:00:00-2023-01-07 14:00:00
            9	orderFee	int	是1	订单金额(key)，单位分
            10	refundFee	int	是2、4、5	退款金额(key)，单位分
            11	orderTm	string	是1	下单时间(key)，格式yyyy-MM-dd HH:mm:ss
            12	refundTm	string	是2、4、5	退款时间(key)，格式yyyy-MM-dd HH:mm:ss
            13	apptFailReason	string	否2	预约失败原因
            14	remark	string	否all	备注信息
            15	extendJson	string	否	业务扩展 json 字符串

            2.6. 请求示例\应用场景(JSON)示例
            请求报文（仅给出msgData业务数据报文）:

            {
                "type": 1,
                "data": {
                    "opType": 1,
                    "orderId": "10002949559603",
                    "cabinetCode": "FC7556162",
                    "empNo": "01412278",
                    "phone": "13888888888",
                    "paymentType": "网点钱包（公司月结）",
                    "waybillNo": "SF1828711649427",
                    "gridType": "小",
                    "discountType": null,
                    "discountFee": null,
                    "payedFee": 0.4,
                    "deliverTm": "2023-01-11 00:41:00"
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            success为true时（当无法给出是否月结判断时（如系统内部异常、必传参数为空等），suucess才为false），有obj相应内容，字段如下：
            #	属性名	类型（约束）	必填	描述
            1	settleFlag	int	是	月结标志，0不月结，1月结
            2	reason	string	否	不月结原因，settleFlag=0时有值，如"小哥工号在黑名单中"
            3	failCode	string	否	不月结代码
            4	areaCode	string	是	地区编码
            5	deptCode	string	是	网点编码
            6	responseId	string	是	每个请求的唯一标识UUID
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            success为true时，有obj响应内容:
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                        "settleFlag": 1,
                        "areaCode": "755Y",
                        "deptCode": "755A",
                        "responseId": "ae56fe3e-05fb-4791-a6b0-d815b258f2ed"
                    }
                }
            }
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "obj": {
                        "settleFlag": 0,
                        "reason": "小哥工号在黑名单中",
                        "failCode": "A001",
                        "areaCode": "755Y",
                        "deptCode": "755A",
                        "responseId": "17e83ef0-b719-4eca-a541-eee487d270f8"
                    }
                }
            }
            success=false（无法判断是否月结），失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorMessage": "订单号不能为空"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_FC_SETTLE_VERIFY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFcSettleVerify>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 门店异常件退件处理
        /// 异常件处理。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbuss659(string partnerID, string checkword, MsgDataRequestEosWillbillbuss659 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.2.1 业务数据报文
            #	属性名	类型（约束）	必填	说明	描述
            1	header			
            2	content	obj	是		content业务具体请求参数
            2.2.2 header字段请求参数列表

            #	属性名	类型（约束）	必填	说明	描述
            1	deptCode	string	否		城市编码
            2	oprId	string	是		操作人工号
            3	sgs_netcode	string	是		区代码
            3	accessCode	string	是		系统接入编码，分配找：698533
            2.3. 请求参数<msgData> /content/param
            content字段请求参数列表

            #	属性名	类型（约束）	必填	说明	描述
            1	param	object	是		param请求参数对象
            param参数对应对象字段信息

            #	属性名	类型（约束）	必填	说明	描述
            0	api	string	是		该接口填写值：sf_exception_pack
            1	agent_code	string	是		合作网点自有编码
            2	waybill_no	string	是		顺丰运单号
            3	partner_id	string	是		合作伙伴ID
            4	area_code	string	是		地区编码
            5	city_id	string	否		城市编码
            6	type	string	是		收派类型（1=收件/2=派件）
            7	exception_time	string	是		异常件时间，格式：yyyy-MM-dd HH:mm:ss
            8	exception_reason	string	否		异常件原因
            9	extendJson	string	否		业务扩展json字符串
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090"
                },
                "content":{
                    "param":{
                        "api":"sf_handover_pack",
                        "agent_code":"sdf",
                        "partner_id":"YSF14SD1",
                        "area_code":"755A",
                        "city_id":"755",
                        "waybill_no":"033796774975",
                        "receiver_payment":"0",
                        "sf_handover_time":"2021-07-16 10:09:00"
                    }
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
                "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
                "apiResultCode":"A1000",
                "apiResultData":"{	\"success\":true}"
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
              "{\"errorMessage\":\"请求失败，请重试\",\"success\":false,\"errorCode\":\"09020501\"}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_659";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbuss659>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 渠道可派件交接管控
        /// 根据渠道、便利店等信息判断操作人员是否可以对这票件进行操作
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbuss130(string partnerID, string checkword, MsgDataRequestEosWillbillbuss130 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            #	属性名	类型（约束）	必填	默认值	描述
            1	operationControl	String	否		管控结果（1表示管控，0表示不管控）
            2	reasonCode	String	否		管控原因编码，事先约定内容
            3	reason	String	否		管控原因描述，事先约定描述
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"obj\":{\"operationControl\":\"0\"},\"success\":true}"
            }
            失败报文-范例1
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"errorCode\":\"800001\",\"errorMessage\":\"运单号格式非法.\",\"success\":false}"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_130";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbuss130>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 顾客到店寄件
        /// 根据渠道、便利店等信息判断操作人员是否可以对这票件进行操作
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbuss655(string partnerID, string checkword, MsgDataRequestEosWillbillbuss655 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文(msgData):

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090"
                },
                "content":{
                    "param":{
                        "api":"customer_send_pack",
                        "agent_code":"sdf",
                        "partner_id":"YSF14SD1",
                        "area_code":"755A",
                        "city_id":"755",
                        "waybill_no":"SF40000021380133",
                        "receiver_payment":"0",
                        "receive_waybill_time":"2021-07-15 18:09:00",
                        "weight":"2.00",
                        "pack_fee":"32.00",
                        "insurance_money":"1.00",
                        "insurance_fee":"1.00",
                        "ext1":""
                    }
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"success\":false}"
            }
            失败响应：
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"errorCode\":\"-177\",\"errorMessage\":\"未操作130，不能进行该操作\",\"success\":false}"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_655";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbuss655>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 顺丰小哥到店收件
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbuss656(string partnerID, string checkword, MsgDataRequestEosWillbillbuss656 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13022939",
                    "sgs_netcode":"755A"
                },
                "content":{
                    "ehead":"",
                    "oprId":"13099090",
                    "deptCode":"755",
                    "waybillNo":"SF4000002138013",
                    "channel":"rider",
                    "operation":"delivery",
                    "storeCode":"SF13925563587",
                    "storeType":"7"
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            #	属性名	类型（约束）	必填	默认值	描述
            1	operationControl	String	否		管控结果（1表示管控，0表示不管控）
            2	reasonCode	String	否		管控原因编码，事先约定内容
            3	reason	String	否		管控原因描述，事先约定描述
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"obj\":{\"operationControl\":\"0\"},\"success\":true}"
            }
            失败响应：
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"errorCode\":\"800001\",\"errorMessage\":\"运单号格式非法.\",\"success\":false}"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_656";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbuss656>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 门店接收小哥派件
        /// 客户可通过此接口可以把包裹交接给到门店。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbuss657(string partnerID, string checkword, MsgDataRequestEosWillbillbuss657 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090"
                },
                "content":{
                    "param":{
                        "api":"sf_handover_pack",
                        "agent_code":"sdf",
                        "partner_id":"YSF14SD1",
                        "area_code":"755A",
                        "city_id":"755",
                        "waybill_no":"033796774975",
                        "receiver_payment":"0",
                        "sf_handover_time":"2021-07-16 10:09:00"
                    }
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            #	属性名	类型（约束）	必填	默认值	描述
            1	operationControl	String	否		管控结果（1表示管控，0表示不管控）
            2	reasonCode	String	否		管控原因编码，事先约定内容
            3	reason	String	否		管控原因描述，事先约定描述
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"success\":false}"
            }
            失败响应：
            {
               "apiErrorMsg": "",
               "apiResponseID": "00017AEBA406E63FEEF86DBD87770B3F",
               "apiResultCode": "A1000",
               "apiResultData": "{\"errorCode\":\"-177\",\"errorMessage\":\"未操作130，不能进行该操作\",\"success\":false}"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_657";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbuss657>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 丰巢区域外包门店新增及更新
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosFcWbstoreAddOrUpdate(string partnerID, string checkword, MsgDataRequestEosFcWbstoreAddOrUpdate data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：丰巢服务站信息接收或更新

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "storeCode": "fc0011",
                    "partnerId": "QYWB2021",
                    "siteStatus": 2,
                    "siteName": "FC服务站1",
                    "openFlag": 1,
                    "startOpenTime": "123451234128",
                    "linkman": "里昂",
                    "phone": "151224432218",
                    "emergencyPhone": "12131231",
                    "provincename": "广东省",
                    "cityname": "深圳市",
                    "countyname": "南山区",
                    "townname": "粤海街道",
                    "address": "软件基地1栋",
                    "lng": 11.222222222222,
                    "lat": 22.33333333333,
                    "placeType": "1",
                    "serviceContentType": "1",
                    "serviceContentTypeEx": "",
                    "siteType": "1",
                    "serviceTime": "00:00--08:00",
                    "contractor": "ddd",
                    "contractorPhone": "15118029038"
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	virtualAddr	String	否		服务站ID
            1	storeCode	String	否		自有编码
            1	aoiAreaCode	String	否		AOI区域编码
            1	aoiCode	String	否		AOI编码
            1	cnCode	String	否		经营本部代码
            1	areaCode	String	否		地区代码
            1	deptCode	String	否		网点代码
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无
            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":{\"virtualAddr\":\"SF19765352141\"}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_FC_WBSTORE_ADD_OR_UPDATE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosFcWbstoreAddOrUpdate>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 顾客到店取件
        /// 客户可通过此接口可以把包裹交接给到门店。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbuss658(string partnerID, string checkword, MsgDataRequestEosWillbillbuss658 data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.2.1 业务数据报文
            #	属性名	类型（约束）	必填	说明	描述
            1	header	obj	是		header中参数
            2	content	obj	是		content业务具体请求参数
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090"
                },
                "content":{
                    "param":{
                        "api":"customer_receive_pack",
                        "agent_code":"sdf",
                        "partner_id":"YSF14SD1",
                        "area_code":"755A",
                        "city_id":"755",
                        "waybill_no":"033796774975",
                        "receiver_payment":"0",
                        "deliver_waybill_time":"2021-07-16 14:09:00",
                        "extend_attach_31":"4",
                        "extend_attach_32":"妥投"
                    }
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            #	属性名	类型（约束）	必填	默认值	描述
            1	operationControl	String	否		管控结果（1表示管控，0表示不管控）
            2	reasonCode	String	否		管控原因编码，事先约定内容
            3	reason	String	否		管控原因描述，事先约定描述
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{	\"success\":true}"
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorMessage\":\"请求失败，请重试\",\"success\":false,\"errorCode\":\"09020501\"}"
            }  
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_658";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbuss658>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿收发区域外包门店新增及更新
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosYsfWbstoreAddOrUpdate(string partnerID, string checkword, MsgDataRequestEosYsfWbstoreAddOrUpdate data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式；

            6 应用JSON实例
            场景描述：丰巢服务站信息接收或更新

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "storeCode": "ysf0011",
                    "partnerId": "QYWB2021",
                    "siteStatus": 2,
                    "siteName": "FC服务站1",
                    "openFlag": 1,
                    "startOpenTime": "123451234128",
                    "linkman": "里昂",
                    "phone": "151224432219",
                    "emergencyPhone": "12131231",
                    "provincename": "广东省",
                    "cityname": "深圳市",
                    "countyname": "南山区",
                    "townname": "粤海街道",
                    "address": "软件基地1栋",
                    "lng": 11.222222222222,
                    "lat": 22.33333333333,
                    "placeType": "1",
                    "serviceContentType": "1",
                    "serviceContentTypeEx": "",
                    "siteType": "1",
                    "serviceTime": "00:00--08:00",
                    "contractor": "ddd",
                    "contractorPhone": "15118029038",
                    "serviceArea": "755FG034",
                    "aoiCode": "755EE000001",
                    "cnCode": "CN01",
                    "areaCode": "755Y",
                    "deptcode": "755FG",
                    "aoiType": "120301"
                }
            }
            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	virtualAddr	String	否		服务站ID
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":{\"virtualAddr\":\"SF19765352141\"}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_YSF_WBSTORE_ADD_OR_UPDATE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosYsfWbstoreAddOrUpdate>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿站信息查询
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosWillbillbussStoreInfo(string partnerID, string checkword, MsgDataRequestEosWillbillbussStoreInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090"
                },
                "content":{
                    "virtualAddr":"SF15322016108",
                    "systemId":"SKSS", 
                    "apiVersion":"1.3"
                }
            }

            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	name	String	否		便利店名称
            2	telephone	String	否		联系电话
            3	virtualAddr	String	否		便利店编码
            4	lng	String	否		经度
            5	lat	String	否		纬度
            6	storeType	String	否		便利店类型（1顺丰店，2个体店，3分点部，4连锁店，5顺丰站，6客户接触点，7嘿客店，8营业站，9汪勇项目，10乐收直营 ，11丰伙轮，12小哥直营点，101丰巢物业，102丰巢个体超市，103丰巢企业前台，104丰巢连锁门店，105丰巢乡镇代收点，106丰巢无人驿站，107丰巢直营点，108丰巢快递网点，109丰巢第三方，110丰巢校园点，111其他）
            7	deptCode	String	否		网点编码
            8	serviceTime	String	否		服务时间
            9	serviceTimeSat	String	否		周六服务时间
            10	serviceTimeSun	String	否		周日服务时间
            11	serviceTimeFes	String	否		节假日服务时间
            12	serviceContentType	String	否		服务内容：1、寄件服务2、自取服务3、寄、取件服务
            13	isDelete	String	否		是否删除 0:未删除 1:已删除
            14	storeCode	String	否		门店编码
            15	areaCode	String	否		地区编码
            16	serviceArea	String	否		AOI区域编码
            17	dateApprove	String	否		审批日期
            18	phone	String	否		手机号码
            19	partnerId	String	否		合作伙伴ID
            20	serviceContentTypeEx	String	否		商品销售服务1=顺手寄,2=上门派送,4=O2C业务合作,8=个人地址服务,16=便民服务,32=嵌入式服务,3=上门取件,5=上门派件、上门取件
            21	factoryId	String	否		供应商编码
            22	isStoragePoint	String	否		是否存放点（0：否，1：是）
            23	cnCode	String	否		经营本部代码
            24	bukrs	String	否		账套
            25	aoiCode	String	否		AOI编码
            26	aoiId	String	否		AOI编号
            27	aoiType	String	否		AOI类型
            28	approveStatus	String	否		审批状态,1未提交审批,2正在审批,3审批通过,4审批驳回,5已冻结
            29	channel	String	否		渠道类型 1:城市驿站 2:星管家 3:乡村代理 4:丰巢柜
            30	fengtu	String	否		丰图坐标 1：是 0：不是
            31	positionType	String	否		岗位类型 1：星管家，2：直投员
            32	starBusinessType	String	否		星管家类型
            33	starLevel	String	否		1-一星级 2-二星级 3-三星级 4-四星级 5-五星级
            34	employeeNo	String	否		工号
            35	fcBusinessType	String	否		丰巢服务站场所类型 1:商住混合区;2:政府机构;3:商场;4:医院;5:学校;6:写字楼;7:住宅
            36	emergencyPhone	String	否		丰巢服务站紧急联系电话
            37	startOpenTime	String	否		丰巢服务站开始运营日期
            38	openFlag	String	否		丰巢服务站是否对外开放 1:是 0:否
            39	address	String	否		详细地址
            40	provincename	String	否		省份
            41	cityname	String	否		城市
            42	countyname	String	否		县区
            43	townname	String	否		乡镇
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":{\"address\":\"琶洲新村18栋B琶洲快递收发室\",\"cityName\":\"广州市\",\"countyName\":\"海珠区\",\"isFreeze\":\"false\",\"isNeedCxSendMsg\":\"null\",\"phone\":\"13692439678\",\"provinceName\":\"广东省\",\"storeName\":\"纳洋-琶洲快递收发室\",\"storeType\":\"4\",\"virtualAddr\":\"SF15322016108\"},\"success\":true}"
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            -150	合作网点不能为空	系统错误
            -151	顺丰运单号不合法	系统错误
            -152	到寄付标志不合法	系统错误
            -155	顺丰取件时间格式不合法	系统错误
            -161	未找到当前门店信息	系统错误
            -162	当前快件信息未入库，提交数据失败	系统错误
            -183	当前门店存在多个便利店编码	系统错误
            -184	当前门店处于冻结状态	系统错误
            -182	未找到当前门店所属点部代码	系统错误
            500	系统内部异常	系统错 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_WILLBILLBUSS_STORE_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosWillbillbussStoreInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取OSSToken信息
        /// 获取OSSToken信息，用于采用外网直传图片模式
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosGetOssToken(string partnerID, string checkword, MsgDataRequestEosGetOssToken data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8”
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：获取OSSToken信息

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "ossClientName":"skss-oss-client",
                    "pathId":"1002"
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"success\":true,\"obj\":\"AUTH_tkv12_23f16b059c42f19ae685fdcb58bcd9839a41751a2b31de682399eff9d0b8095a0e7bf7e5bcf4bab6ca1133b13915843c7b02649e60b2deed423106350779720581512d48c573908ac6d255bf47a2787a4d96e3fbd53b6767dd1084764aa90cc8\"}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"描述信息\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_GET_OSS_TOKEN";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosGetOssToken>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = msgDataResponse.obj;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 星管家排班信息查询
        /// 格口信息查询。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosQueryGridInfo(string partnerID, string checkword, MsgDataRequestEosQueryGridInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "xgs"
                },
                "content": {
                    "courier_code": "90410804",
                    "batch_code": "02D",
                    "aoi_list": [
                        "512TG000062",
                        "512TG000261",
                        "512TG000085",
                        "512TG000066",
                        "512TG000070",
                        "512TG000067",
                        "512TG000071",
                        "512TG000069",
                        "512TG000281"
                    ]
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	bin_code	String	否		格⼝号
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":{\"bin_code\":\"星管家格口3\"},\"success\":true}"
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"110002\",\"errorMessage\":\"小哥90410804在该班次存在排班结果\",\"success\":false}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            -150	合作网点不能为空	系统错误
            -151	顺丰运单号不合法	系统错误
            -152	到寄付标志不合法	系统错误
            -155	顺丰取件时间格式不合法	系统错误
            -161	未找到当前门店信息	系统错误
            -162	当前快件信息未入库，提交数据失败	系统错误
            -183	当前门店存在多个便利店编码	系统错误
            -184	当前门店处于冻结状态	系统错误
            -182	未找到当前门店所属点部代码	系统错误
            500	系统内部异常	系统错 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_QUERY_GRID_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosQueryGridInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 图片上传
        /// 格口信息查询。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosUploadPicture(string partnerID, string checkword, MsgDataRequestEosUploadPicture data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8”
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式；

            6 应用JSON实例
            场景描述：图片上传

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "ossClientName":"skss-oss-client",
                    "fileTypeName":"png",
                    "pathId":"1002",
                    "base64Content":""
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无
            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"success\":true,\"obj\":\"toap/test/TOAPb27c7bfb0e7740f5aaab7824abc155f5.png",\"}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"描述信息\",\"success\":false}"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_UPLOAD_PICTURE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosUploadPicture>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = msgDataResponse.obj;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 丰巢服务站信息接收或更新
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult ToapSubmitResourceInfo(string partnerID, string checkword, MsgDataRequestToapSubmitResourceInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
                    "accessCode":""
                },
                "content":{
                    "storeCode":"",
                    "partnerId":"", 
                    "siteStatus":""
                }
            }
            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	storeCode	String	否		自有编码
            2	virtualAddr	String	否		服务站ID
            3	aoiAreaCode	String	否		AOI区域编码
            4	aoiCode	String	是		AOI编码
            5	cnCode	String	否		经营本部代码
            6	areaCode	String	否		地区代码
            7	deptCode	String	否		网点代码
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":{\"storeCode\":\"dsafasd123\",\"virtualAddr\":\"SF19765352141\",\"aoiAreaCode\":\"755FG000018\",\"aoiCode\":\"755FG000018\",\"cnCode\":\"CN01\",\"areaCode\":\"755Y\",\"deptCode\":\"755AN\"},\"success\":true}"
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            -150	合作网点不能为空	系统错误
            -151	顺丰运单号不合法	系统错误
            -152	到寄付标志不合法	系统错误
            -155	顺丰取件时间格式不合法	系统错误
            -161	未找到当前门店信息	系统错误
            -162	当前快件信息未入库，提交数据失败	系统错误
            -183	当前门店存在多个便利店编码	系统错误
            -184	当前门店处于冻结状态	系统错误
            -182	未找到当前门店所属点部代码	系统错误
            500	系统内部异常	系统错 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_TOAP_SUBMIT_RESOURCE_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseToapSubmitResourceInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 星管家基本信息新增
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddXgjStoreInfo(string partnerID, string checkword, MsgDataRequestEosAddXgjStoreInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：星管家基本信息新增

            msgData对应请求的JSON字符串:
            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
                    "accessCode":""
                },
                "content":{
                    "storeCode":"",
                    "partnerId":"", 
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_XGJ_STORE_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddXgjStoreInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿站基本信息新增
        /// 城市驿站基本信息新增/更新。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddStoreInfo(string partnerID, string checkword, MsgDataRequestEosAddStoreInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
                "accessCode":""
                },
                "content":{
                    "storeCode":"",
                    "partnerId":"", 
                    "siteStatus":""
                }
            }

            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj响应内容
            2.5. 响应参数<apiResultData>
            obj响应内容对象
            #	属性名	类型（约束）	必填	默认值	描述
            1	storeCode	String	否		自有编码
            2	virtualAddr	String	是		服务站ID
            3	aoiAreaCode	String	否		AOI区域编码
            4	aoiCode	String	否		AOI编码
            5	cnCode	String	否		经营本部代码
            6	areaCode	String	否		地区代码
            7	deptCode	String	否		网点代码
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            -150	合作网点不能为空	系统错误
            -151	顺丰运单号不合法	系统错误
            -152	到寄付标志不合法	系统错误
            -155	顺丰取件时间格式不合法	系统错误
            -161	未找到当前门店信息	系统错误
            -162	当前快件信息未入库，提交数据失败	系统错误
            -183	当前门店存在多个便利店编码	系统错误
            -184	当前门店处于冻结状态	系统错误
            -182	未找到当前门店所属点部代码	系统错误
            500	系统内部异常	系统错 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_STORE_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddStoreInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 星管家相册新增
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddXgjImg(string partnerID, string checkword, MsgDataRequestEosAddXgjImg data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8”
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：星管家相册新增

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "identityFileNames": [
                        "0121a1ccd4f64902be1422c31fbd6daa.jpg"
                    ],
                    "faceFileNames": [
                        "a82eda37b4ef43148b137381d3e394a9.jpeg"
                    ],
                    "houseFileNames": [
                        "a82eda37b4ef43148b137381d3e394a9.jpeg"
                    ],
                    "virtualAddr": "SF15118020019"
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无
            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"success\":true}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_XGJ_IMG";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddXgjImg>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 星管家运单及好评费更新
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosXgjWaybillInfo(string partnerID, string checkword, MsgDataRequestEosXgjWaybillInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：星管家运单及好评费更新

            msgData对应请求的JSON字符串:
            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
                    "accessCode":""
                },
                "content":{
                    "waybillNo":"",
                    "billType":1,
                    "billDate":"",
                    "starVirtualAddr":"",
                    "starEmpCode":"",
                    "starSendType":1,
                    "isSettle":1,
                    "goodFee":0.00,
                    "pushTime":"",
                    "remark":""
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无
            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_XGJ_WAYBILL_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosXgjWaybillInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = msgDataResponse.obj;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 星管家保险费更新
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosXgjUpdateSafeFee(string partnerID, string checkword, MsgDataRequestEosXgjUpdateSafeFee data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：星管家保险费更新

            msgData对应请求的JSON字符串:
            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
                    "accessCode":""
                },
                "content":{
                    "starVirtualAddr":"",
                    "identityCard":"",
                    "safeMonth":"", 
                    "safeFee":0.00
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_XGJ_UPDATE_SAFE_FEE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosXgjUpdateSafeFee>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = msgDataResponse.obj;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 回单信息
        /// 驿站类-回单信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosReceiptWaybillInfo(string partnerID, string checkword, MsgDataRequestEosReceiptWaybillInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：回单信息

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "param": {
                        "api": "single_waybill_info",
                        "partner_id": "YSF14SD1",
                        "waybillNo": "033531831583",
                        "lang_code": "zh_CN",
                        "area_code": "755Y",
                        "clientCode": "inc-sgs-ackwaybill",
                        "deliverEmpCode": "075073",
                        "deliveredType": "1",
                        "destZoneCode": "021A",
                        "signinTm": "2020-05-26 14:23:44",
                        "subscriberName": "RT",
                        "waybillFeeDtoList": [
                            {
                                "createTm": "2019-01-28 16:31:25",
                                "currencyCode": "CNY",
                                "feeTypeCode": "46",
                                "gatherZoneCode": "021A",
                                "isOnlineDeduct": "0",
                                "paymentTypeCode": "1",
                                "paymentChangeTypeCode": "0",
                                "settlementTypeCode": "2",
                                "customerAcctCode": "0212082303",
                                "serviceId": "AAABaJOVmrFKSm+CUqNG5aEKb7GV90v0",
                                "waybillNo": "762942621542"
                            },
                            {
                                "currencyCode": "CNY",
                                "feeTypeCode": "1",
                                "gatherZoneCode": "021A",
                                "isOnlineDeduct": "0",
                                "paymentTypeCode": "2",
                                "paymentChangeTypeCode": "0",
                                "settlementTypeCode": "2",
                                "customerAcctCode": "0212082303",
                                "waybillNo": "762942621542"
                            }
                        ],
                        "waybillMarkDtoList": [
                            {
                                "labellingPattern": "ELEC_SIGN_FLG"
                            }
                        ],
                        "waybillNo": "762942621542",
                        "waybillServiceDtoList": [
                            {
                                "attribute1": "2",
                                "attribute2": "",
                                "attribute3": "",
                                "attribute4": "",
                                "attribute5": "",
                                "serviceProdCode": "IN46"
                            }
                        ]
                    }
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无
            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_RECEIPT_WAYBILL_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosReceiptWaybillInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = msgDataResponse.obj;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 通用运单查询
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosQueryWaybillInfo(string partnerID, string checkword, MsgDataRequestEosQueryWaybillInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：通用运单查询

            msgData对应请求的JSON字符串:
            {
                "header":{
                    "deptCode":"755",
                    "oprId":"13099090",
                    "accessCode":""
                },
                "content":{
                    "param": {
                        "lang_code": "1",
                        "waybill_no": "033531831583",
                        "api": "get_waybill_info",
                        "partner_id": "GZLS4K8L",
                        "city_id": "755",
                        "area_code": "755Y"
                    }
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            成功时（即success为true），有obj 响应内容，字段如下：

            #	属性名	类型（约束）	必填	描述
            1	receiver_address	String	否	收件人地址（加密）
            2	sender	String	否	寄件人姓名
            3	sender_phone	String	否	寄件人电话（加密）
            4	sender_mobile	String	否	寄件人移动电话（加密）
            5	receiver	String	否	收件人姓名
            6	receiver_phone	String	否	收件人电话（加密）
            7	receiver_mobile	String	否	收件人移动电话（加密）
            8	payer	String	否	付款方:{sender,receiver,third}
            9	pack_fee	String	否	运费
            10	insurance_fee	String	否	保价费
            11	cod_bill_flg	String	否	是否代收货款
            12	cod_fee	String	否	代收货款
            13	deliverEmpCode	String	否	派件员工号
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"obj\":\"SF353534534\"}
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_QUERY_WAYBILL_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosQueryWaybillInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 丰巢服务站相册新增
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddFcImg(string partnerID, string checkword, MsgDataRequestEosAddFcImg data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8”
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式 

            6 应用JSON实例
            场景描述：驿站信息查询

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "siteDoorFileNames": [
                        "002180369e7b433f8723dc62c4b983fb.png",
                        "00288d0e986e4bf29aadc66879299f27.png"
                    ],
                    "siteInsideFileNames": [
                        "003a388cfbf54491948b9680a8c59425.png"
                    ],
                    "siteFileNames": [
                        "0041c0f0655643a6ae67645b77bf4acd.png"
                    ],
                    "virtualAddr": "SF15118020019"
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"success\":true}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_FC_IMG";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddFcImg>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 驿站相册新增
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAddStoreImg(string partnerID, string checkword, MsgDataRequestEosAddStoreImg data, string accessToken = "", string environment = "bspgw")
        {
            /*
            7 通信协议
            通讯双方采用http post方法作为通讯协议。请求头必须添加:

            "Content-type","application/x-www-form-urlencoded;charset=UTF-8”
            http请求参数需通过http URL编码传送；业务数据报文支持xml、json两种报文数据格式； 

            6 应用JSON实例
            场景描述：驿站信息查询

            msgData对应请求的JSON字符串:
            {
                "header": {
                    "deptCode": "755",
                    "oprId": "13099090",
                    "accessCode": "YSF001"
                },
                "content": {
                    "backgroundFileNames": [
                        "000748def4594ee49424f565304920d1.png",
                        "000e0813c4e64bf7947f24ad040b05eb.png"
                    ],
                    "licenseFileNames": [
                        "001355ba1e16410a816cbbc16a6f9b8d.png",
                        "0020eec682504657ad33c981c427dda5.png"
                    ],
                    "virtualAddr": "SF15118020019"
                }
            }

            4 响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API平台结果代码
            apiErrorMsg	String(200)	N	API平台异常信息
            apiResponseID	String(40)	Y	API响应唯一号UUID
            apiResultData	object	N	业务处理详细结果
            业务处理结果详细参数：
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回true;失败返回false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	String	否		obj响应内容
            5 错误代码表
            5.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功；
            注意：不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            5.2 业务异常代码
            原因代码	描述	分类
            TOAP1001	XX参数错误	系统错误
            TOAP2001	TOAP系统业务错误	系统错误
            TOAP3001	TOAP系统异常	系统错误
            TOAP4001	下游接口请求异常	系统错误
            TOAP5001	请求熔断	系统错误
            业务处理结果详细参数：
            无

            响应JSON：

            请求正常的：

            {	"apiErrorMsg":"",
            "apiResponseID":"00016E7E2AD1F43FE443509C108FE33F",
            "apiResultCode":"A1000",
            "apiResultData":"{\"success\":true}"
            }
            请求异常的：

            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": 
            "{\"errorCode\":\"TOAP2001\",\"errorMessage\":\"便利店编码有误\",\"success\":false}"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_ADD_STORE_IMG";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseEosAddStoreImg>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 便利店运单批量盘点
        /// 通过此接口可批量对便利店运单上传 600 路由(滞留件盘点) 
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="greymark">为了进行灰度，请在请求头中添加greymark字段，greymark取值按如下格式： partnerid=YSF001&areacode=769Y&deptcode=755A&storecode=AAAAAAA&
        /// 如某字段无法取到，填充为default 例如，deptcode无法取到，greymark按照如下传值 partnerid=YSF001&areacode=769Y&deptcode=default&storecode=AAAAAAA&</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult StoreExpressCheck(string partnerID, string checkword, string greymark, MsgDataRequestStoreExpressCheck data, string accessToken = "", string environment = "bspgw")
        {
            /*
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号 UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	accessToken,使用 OAuth2 方式认证时必填
            获取方法参考：OAuth2 认证说明
            7	msgData	String	是	业务数据报文
            为了进行灰度，请在请求头中添加greymark字段，greymark取值按如下格式：
            partnerid=YSF001&areacode=769Y&deptcode=755A&storecode=AAAAAAA&
            如某字段无法取到，填充为default
            例如，deptcode无法取到，greymark按照如下传值
            partnerid=YSF001&areacode=769Y&deptcode=default&storecode=AAAAAAA&

            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
              "agent_code": "145205",
              "partner_id": "ZSHM77YF",
              "waybill_nos": ["033222868176", "033222868177", "033512962429"],
              "api": "express_check",
              "area_code": "755Y"
            }

            2.4. 公共响应参数
            属性列表	类型	是否必传	含义
            apiResultCode	String(10)	Y	API 平台结果代码
            apiErrorMsg	String(200)	N	API 平台异常信息
            apiResponseID	String(40)	Y	API 响应唯一号 UUID
            apiResultData	object	N	业务处理详细结果
            apiResultData 业务处理结果详细参数：

            #	属性名	类型（约束）	必填	默认值	描述
            1	requestId	String	否		请求 id
            2	business	String	否		业务编码
            3	params	String	否		错误提示占位符值
            4	success	boolean	是		成功返回 true;失败返回 false
            5	errorCode	String	否		错误编码
            6	errorMessage	String	否		错误描述
            7	date	String	否		服务端响应时间 格式:yyyy-MM-dd HH:mm:ss
            8	version	String	否		服务端版本信息
            9	obj	object	否		obj 响应内容
            2.5. 响应参数<obj>
            #	属性名	类型（约束）	必填	默认值	描述
            1	msg	String	否		提示信息
            2	failList	List<FailResult>	否		失败运单集合,success=true 时表示至少有一个运单成功，失败的运单信息放在 failList 中
            failList 集合中的 FailResult 类型包含以下字段：

            #	属性名	类型（约束）	必填	默认值	描述
            1	waybill_no	String	是		运单号
            2	reason	String	是		失败原因
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应（至少有一个运单成功时，success 为 true，当 failList 集合为空时表示全部运单操作成功）:
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": true,
                "obj": {
                  "msg": "部分操作成功",
                  "failList": [
                    {
                      "reason": "客户已签收不允许盘点",
                      "waybill_no": "033222868176"
                    },
                    {
                      "reason": "客户已签收不允许盘点",
                      "waybill_no": "033222868177"
                    }
                  ]
                }
              }
            }
            失败响应：
            {
              "apiErrorMsg": "",
              "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
              "apiResultCode": "A1000",
              "apiResultData": {
                "success": false,
                "errorCode": "-150",
                "errorMessage": "合作网点不能为空"
              }
            }
            3 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性 apiResultData 中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP 无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            -150	合作网点不能为空	系统错误
            -161	未找到当前门店信息	系统错误
            -182	未找到当前门店所属点部代码	系统错误
            -183	当前门店存在多个便利店编码	系统错误
            -184	当前门店处于冻结状态	系统错误
            -251	运单号集合为空或格式不正确	系统错误
            -252	运单号集合超过批量大小限制	系统错误
            -253	该接口仅支持易收发的城市驿站操作	系统错误
            -254	批量查询路由信息异常	系统错误
            -255	全部操作失败	系统错误
            500	系统内部异常	系统错误 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_STORE_EXPRESS_CHECK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseStoreExpressCheck>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 终端驿站类

        #region 会员权益类

        #endregion 会员权益类
    }
}
